现在的位置: 首页 > 综合 > 正文

Microsoft Enterprise Library—解读Configuration之存储提供者与转换器

2013年05月21日 ⁄ 综合 ⁄ 共 2034字 ⁄ 字号 评论关闭

最近研究了一下Microsoft Enterprise LibraryConfiguration的源代码,对其构架有了一个大体的认识,学到了不少的东西,虽然代码比较简单,但是它的构架灵活性,可扩展性,可配置性。很值得我学习和借签。

在日常的工作中,在作某系统应用时,没有站在构架这个高度上去考虑问题。可能是因为偷懒,或者脑袋不原去考虑那么多的问题,所以编写出的代码非常的死板,在系统需求稍稍变动一点点,往往会导致整个系统代码的修改。呵呵,这也许就是成长的代价吧。

言归正传,Configuration因为其特点:因为处于最基础的设施,所以要求构架灵活,能从各种存储(XMLSQL SERVER。。。)读写配置数据。与其说Configuration是配置,倒不如说它是在定义。它在定义如何从存储中读写数据,并转化成使用者(系统)希望看到的配置性的类,这也就是所说的面向接口编程吧。

首先要解决是配置提供者的接口,Configuration提供了IConfigurationProvider接口,其协定如下:ConfigurationName属性,和Initialize(ConfigurationView configurationView)方法;

就是说,任何配置提供者必须有一个配置名,并能初始化(configurationView为元数据信息视图)

其次为配置数据阅读者,IStorageProviderReader,它继承了IConfigurationProvider接口,并提供CurrentSectionName(当前要读的配置节名)属性和Read方法。

再次为是实现了IConfigurationProvider接口的ConfigurationProvider抽象类,它规定了实际配置提供者要实现的方法,即

Initialize(ConfigurationView configurationView)抽象方法。其实此类没有什么东东。

以下是存储器提供者:StorageProvider,它继承了IStorageProviderReader接口和ConfigurationProvider类,这样,一个存储器提供者综合这两个协约,将有如下要实现的方法:

Initialize(),Read()。

将数据从存储器读出来以后,如果你愿意,就可以将这类数据直接送给系统。比如臭名昭著的DATASET,不过Configuration给我们提供了转换器接口ITransformerITransformer将负责将StorageProvider提供的数据转换成系统使用者希望看到的信息体(域类或者是DataSet),而Configuration仅仅将这一过程当作为一个黑匣子,并提供中间件功能,比如缓存,监视其动作等等。那么ITransformer的方法就应该是解析和包装:

Deserialize(),Serialize(),当然它也得初始化,所以它也继承了IConfigurationProvider接口,

此外,Configuration将转换器接口作了一次抽象类的包装:TransformerProvider,此类不但继承了ITransformer,并继承了ConfigurationProvider,这样一个实际的转换器要实现的方法为:

Initialize(),Deserialize(),Serialize()

Configuration定义好存储提供者和转换器后,接下来的事情就是要通过工厂模式给Configuration提供实际的存储提供者和转换器,这样,Configuration写了一个通用的抽象工作厂ConfigurationFactory,此类任务是获取Configuration的上下文,并根据配置名称的一个配置类CreateInstance(string configurationName),在这个方法里,它的工作是CreateObject(),(注:存储提供者和转换者其实都是配置器,这一点有点牵强),接下来,ProviderFactory继承了ConfigurationFactory,没有什么大的功能,它重写了CreateObject(),旨在初始化存储提供者和转换者,这就是为什么IConfigurationProvider有Initialize这个方法。

最后,Configuration针对存储提供者和转换者分别写了StorageProviderFactory和TransformerFactory,当然它们都继承了ProviderFactory,这个两个类里,它们作了一个非常重要的工作。实现了ConfigurationFactory的GetConfigurationType()方法,为什么呢?呵,不说也知道,没有这个方法。ConfigurationFactory的CreateInstance就是巧妇难为无米之炊洛。

在提供者和转换器范围的类关系图如下:
1.jpg

抱歉!评论已关闭.