客户端应用系统开发中的全局数据对象容器

在做客户端应用程序的时候,经常会遇到参数传递的为问题。方法之间的到无所谓,关键是对象之间的传递。比如在做sharpmap开发的时候,Map对象一般情况下只有一个,在理论上来说是一个全局对象,如果在一个类中需要调用Map对象的坐标转换方法,需要这样做:

    public class Class1
    {
        Map map;
        public Class1(Map map)
        {
            this.map = map;
        }

        public Coordinate Calculate()
        {
            if (map != null)
                return this.map.ImageToWorld(new PointF(10, 10));
            return null;
        }
    }
创建调用:

var obj1 = new Class1(mapBox1.Map);
var pt = obj1.Calculate();
如果类Class1需要Map,就需要在创建或者初始化的时候将Map对象传递到类对象内部。当系统类似Class1对象非常对的时候,都需要在构造函数或者初始化,或者方法的直接调用的地方,将Map对象传递进去。 既然Map是一个全局唯一对象,为什么要做怎么繁琐的传递(非通用方法接口调用),在系统中,应该有一个全局的容器,将全局唯一对象,放到这个容器中,在需要的时候,获取该对象。

全局对象容器:

    /// <summary>
    /// 注册对象事件委托
    /// </summary>
    /// <param name="name"></param>
    /// <param name="type"></param>
    public delegate void RegisterDataEvent(string name, object type);

    /// <summary>
    /// 移除对象事件委托
    /// </summary>
    /// <param name="name"></param>
    public delegate void RemoveDataEvent(string name);

    /// <summary>
    /// 全局对象容器
    /// </summary>
    public class GlobalContainer
    {
        /// <summary>
        /// 单例模式
        /// </summary>
        private static GlobalContainer instance = null;
        public static GlobalContainer Instance
        {
            get
            {
                if (instance == null)
                    instance = new GlobalContainer();
                return instance;
            }
        }

        /// <summary>
        /// 数据注册事件
        /// </summary>
        public event RegisterDataEvent RegisterData;

        /// <summary>
        /// 数据移除事件
        /// </summary>
        public event RemoveDataEvent RemoveData;

        private Dictionary<string, object> oblist;
        private GlobalContainer()
        {
            oblist = new Dictionary<string, object>();
        }
        /// <summary>
        /// 注册数据对象
        /// </summary>
        /// <param name="name">对象名称</param>
        /// <param name="type">对象引用</param>
        /// <returns></returns>
        public static bool Register(string name, object type)
        {
            try
            {
                if (Instance.oblist.ContainsKey(name))
                    Instance.oblist[name] = type;
                else
                    Instance.oblist.Add(name, type);

                if (Instance.RegisterData != null)
                    Instance.RegisterData(name, type);
                return true;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                return false;
            }
        }
        /// <summary>
        /// 根据名称移除注册对象
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public static bool Remove(string name)
        {
            if (Instance.RemoveData != null)
                Instance.RemoveData(name);

            return Instance.oblist.Remove(name);
        }
        /// <summary>
        /// 根据名称获取对象
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public object GetInstance(string name)
        {
            if (oblist.ContainsKey(name))
                return oblist[name];
            return null;
        }
        /// <summary>
        /// 根据名称获取泛型对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="name"></param>
        /// <returns></returns>
        public static T GetInstance<T>(string name) where T : class
        {
            return Instance.GetInstance(name) as T;
        }
    }

改造后的Class1类:

    public class Class1
    {
        public Class1()
        {
        }

        public Coordinate Calculate()
        {
            var map = GlobalContainer.GetInstance<Map>("map");
            if (map != null)
                return map.ImageToWorld(new PointF(10, 10));
            return null;
        }
    }
调用:

            var obj1 = new Class1();
            var pt = obj1.Calculate();
对象注册:

GlobalContainer.Register("map", mapBox1.Map);

备注:

有些情况适用于全局对象容器,有些地方不适用。比如在做通用的API接口方法的时候,你该传递什么参数就传递什么。在做一些针对数据的处理操作的时候,可以适当使用(尽量控制)。本文的应用场景是使用Sharpmap开发应用工具的时候,比如距离、面积计算。添加兴趣点工具,选择工具等类中,使用全局Map对象。也可以做为全局数据容器,具体看应用场景了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值