不同包里的全局变量定义方式及系统配置处理
GIS功能的按功能分成不同的包(项目),但是各个包中都要用到相同的东西,比如WorkSpace,比如数据库连接。
从功能的封闭性来讲,最好是不用全局变量。但是由于封装的特殊性(要封闭成COM类),限制了这些参数从构造函数中传递,所以一种方法是让类再拥有一个初始化函数Init(),在这个函数中向相应的类传递参数,当然使用的人也就要多记得这么一个规则了。
另外一方面,由于一个包里的不同功能大多针对相同的WorkSpace、数据库连接等,也可以考虑在各个包中加一个模块,用于存放包内的全局变量,并提供一个初始化的方法。这样,使用一个包的时候就必须先初始化这个包,然后就可以使用包中的所以功能了。
对于配置(指配置文件中读取的配置信息),可以在启动项目中专门建一个模块来读取配置,并存放在各模块的全局变量中,各功能不依赖于配置文件。但是这也带来一个坏处,就是配置在装载时就一次性的读入了,不需要的也读入了。另一种方式是在包中声明一个接口,通过接口得到配置信息。相关一些讨论如下(王咏武):
“服务类”并不负责创建具体的Reader和Writer类的实例对象,而是由应用程序来创建。应用程序创建“服务类”的实例对象时,把具体的Reader和Write对象的引用注入“服务类”内部。这样,“服务类”中的代码就只和抽象接口相关的了。具体实现代码发生变化时,“服务类”不会发生任何变化。添加新的实现时,也只需要改变应用程序的代码,就可以定义并使用新的Reader和Writer类,这种依赖注入方式通常也被称为“构造器注入”。
如果专门为Copy类抽象出一个注入接口,应用程序通过接口注入依赖关系,这种注入方式通常被称为“接口注入”。如果为Copy类提供一个设值函数,应用程序通过调用设值函数来注入依赖关系,这种依赖注入的方法被称为“设值注入”。具体的“接口注入”和“设值注入”请参考[Martin 2004]。
参见http://www.contextfree.net/wangyw/source/dip_ioc.html