您的位置:首页 > 其它

Enterprise Library Step By Step系列(十五):配置应用程序块——设计篇

2005-12-06 09:06 555 查看
Enterprise Library Step By Step系列(十五):配置应用程序块——设计篇

Terrylee,2005年12月05日

概述[/b][/b]

配置应用程序块为应用系统提供了一个通用的配置管理解决方案,可以方便的从各种存储中读取配置信息。在设计上旨在提供一个用于读/写配置数据的简单接口,实现配置数据的读写与数据的存储相分离。使用Storage Provider 和 Transformers在应用和物理存储之间传递数据,同时采用抽象AbstractFactory模式生成Provider数据。先解释一下配置应用程序块中用到的两个重要的概念:

Storage Provider是读写某个物理存储的对象,比如XML文件或SQL数据库

Transformers是在存储格式和应用格式之间转换配置数据的对象

结构设计[/b][/b]

下图展示了组成配置应用程序块的类和对象之间的关系。该图假定您使用 XML 文件存储提供程序和转换器,它们包含在应用程序块中。XML 文件存储提供程序以文件的形式存储配置数据。(其他提供程序使用其他形式的存储,例如 Windows 注册表。)XmlFileStorageProvider 对象指向一个包含特定配置节的配置设置的文件。ConfigurationBuilder 对象指向一个包含特定配置节的配置元数据的文件。通常,包含配置元数据的文件名为 App.config(对于基于 Windows 的应用程序)或 Web.config(对于基于 Web 的应用程序)。

MyConfigClass configData = ConfigurationManager.GetConfiguration("MySettings") as MyConfigClass;
3
4ConfigurationManager.WriteConfiguration("MySettings", configData);

而应用程序块在读写配置数据时,实际上是执行了ConfigurationBuilder的ReadConfiguration()和WriteConfiguration()方法。ConfigurationManager类通过外观模式把这个两个方法封装成了上面所写的GetConfiguration()和WriteConfiguration()方法。

下面我们看一下具体的读写代码:

1public object ReadConfiguration(string sectionName)
2public void WriteConfiguration(string sectionName, object configValue)
2{
3



/**////验证有效性
4

ValidateSection(sectionName);
5


6



/**////注册写前事件
7

ConfigurationChangingEventArgs args = CreateConfigurationChangingEventArgs(sectionName, configValue);
8

OnConfigurationChanging(args);
9

if (!args.Cancel)
10



{
11



/**////创建编写器
12

IStorageProviderWriter configStorageWriter = GetConfigurationStorageWriter(sectionName);
13


14



/**////将要保存的值转换成Provider可识别的格式,具体何种格式是由配置元数据决定的
15

object writeData = GetSerializedDataToWrite(sectionName, configValue);
16

ConfigurationWriterActionCommand writerActionCommand = new ConfigurationWriterActionCommand(configStorageWriter, writeData);
17


18



/**////如果配置节尚不存在就添加此配置数据
19

if (!sections.ContainsSection(sectionName))
20



{
21

AddSection(sectionName, configValue, configStorageWriter);
22

}
23


24



/**////如果配置节已存在就更新此配置数据
25

sections.UpdateSection(sectionName, writerActionCommand, configValue);
26


27



/**////注册写完成事件
28

ConfigurationChangedEventArgs changedArgs = new ConfigurationChangedEventArgs(configFile.FileName, sectionName);
29

OnConfigurationChanged(changedArgs);
30

}
31

}

扩展器和工厂[/b][/b]

由于找不到更好的中文字来说明Provider,所以只好用了扩展器这个名字,大家见谅。来看一下配置应用程序块中的Providers结构图:



IConfigurationProvider[/b] 接口是所有的Providers必须实现的,以便配置应用程序块能够创建和初始化它们。该接口中有一个方法Initialize()和一个属性ConfigurationName,配置应用程序块调用Initialize()方法来创建每一个Providers。

配置应用程序块中包含了一个抽象的基类ConfigurationProvider[/b]。它实现了IConfigurationProvider[/b] 接口中的ConfigurationName属性。

配置应用程序块中的Factories结构图:



ConfigurationFactory是一个抽象的基类,它定义了应用程序块中所有的工厂类的接口,所有的Factory类必须从它继承。ProviderFactory类实现了IConfigurationProvider并从ConfigurationFactory类继承,也是一个抽象类。

总结[/b][/b]

好了,这里引用MSDN上的一句话来结束这篇Post,“设计了配置应用程序块,您就可以用最适合应用程序要求的方式将配置数据存储在应用程序中,使您不受存储方法的限制”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐