在做客户端应用程序的时候,经常会遇到参数传递的为问题。方法之间的到无所谓,关键是对象之间的传递。比如在做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对象。也可以做为全局数据容器,具体看应用场景了。