处理全局的对象的思路。
从我写第一个应用起,我就有个习惯,喜欢定义两个全局变量
BOXTITLE: MessageBox的标题。
SYSTEMNAME: 系统名称。
这样就统一了界面显示的术语,老板一看,呵,到处都是公司名称,
心里高兴。他哪知道当我辞职后,把这两个变量一改,就和原公司无关了
所以用c#后,也必须沿用这种思路。我是这么解决的。
建立一个独立Assembly,其中填加一个类CONFIG.
Public class Config
{
public static string SYSTEMNAME;
public static string BOXTITLE;
static Config
{
SYSTEMNAME=“XXX管理系统”;
BOXTITLE=“XXX管理系统”;
}
}
就是说,一堆静态成员,加上一个静态构造函数。
这样,在使用所谓的全局变量时,直接把这个Assembly引用,并using 它的namespace。
This.Text=Config.SYSTEMNAME;
这样确实很方便,思路也很清晰。
可是有些缺点也出来了,
1.时间已长,这个Config类的静态成员越来越多,渐渐庞大起来。
2.在使用静态成员的代码中,到处充斥着Config.XXX,造成了我的类无法独立出来使用。
3.如果另一个独立的EXE assembly想使用Config中的设置时,却不得不把面对大量的
不需要的 已实例化的静态对象。
-----------------------------------------
基于这个原因,我有了第二个方案
使用Singleton模式,我曾经有段时间固执认为,我是面的实现也是Singleton
我专门有一个zframework 项目,把我写的和从网上下来的组件等,都堆集在里面了。其中有个命名空间
zframework.Program下面放着与一个应用框架相关的类。其中有个PM(ProgramManager)类,它是个Singleton。
PM负责,整个程序的异常,退出,信息显示等功能,当然也包括一个记录全局对象的功能。
Public class PM
{
…
private Hashtable m_VariableBag;
private PM()
{
…
m_VariableBag=new Hashtable();
}
//返回唯一的自己
public static PM Self
{
get
{
if(m_PM==null)
{
m_PM=new PM();
}
return m_PM;
}
}
//放变量
public void StoreVariable(string name,object variable)
{
m_VariableBag[name]=variable;
}
//取变量
public object FetchVaribale(string name)
{
return m_VariableBag[name];
}
}
赋值方式是:
using zframwork.Program
static void Main()
{
string boxtitle="xxx管理系统";
string systemname="xxx管理系统";
PM.Self.StoreVariable("BOXTITLE",boxtitle);
PM.Self.StoreVariable("SYSTEMNAME",systemname);
…
}
取值的方式
using zframwork.Program
public class MyForm:Form
{
string boxtitle=string.emtype;
string systemname=string.empty;
private void initialVarialbe()
{
boxtitle=PM.Selft.FetchVariable(“BOXTITLE”);
systemname=PM.Selft.FetchVariable(“SYSTEMNAME”);
}
}
这种方式,基本上解决了上面的三个问题,但是,有点不好的地方就是所谓的对象的Key --“BOXTITLE”,
是个字符串,有点Hard Code的嫌疑,实际使用中需要配以说明文档。
-----------------------------------------
ps:上面的boxtitlie和systemname完全可以作为pm的属性定义,只有那些与某个具体应用
有关的对象才用store方法存储。