技术开发 频道

Enterprise Library:配置应用程序块

    解耦

   这个词在配置应用程序块中得到了很好的体现,将配置数据的读写和配置数据的存储分离。在配置应用程序块中已经实现了读写XML的Storage Provider,同时支持开发者根据数据存储的物理位置来编写相应的Provider,见下图:


    如果我们编写了自己的Storage Provider和 Transformer,那么我们可以很简单的利用配置工具来修改数据的存储而无须修改任何代码(这也是整个企业库的设计思想的体现,配置驱动)。 

    简化配置 

    配置应用程序块做到让开发人员通过一行代码来实现对配置数据的读取和写入,下面的代码展示了如何读取和写入配置数据:

MyConfigClass configData = ConfigurationManager.GetConfiguration("MySettings") as MyConfigClass; /// 写入配置数据 ConfigurationManager.WriteConfiguration("MySettings", configData);

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

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

public object ReadConfiguration(string sectionName) { ///验证有效性 ValidateSection(sectionName); ///变量configurationSection代表具体的配置数据类:MyConfigClass object configurationSection = sections.GetSection(sectionName); ///缓存存在就直接返回结果 if (IsConfigurationSectionCached(configurationSection)) { return configurationSection; } IStorageProviderReader storageProviderReader = CreateStorageProvider(sectionName); ///变量configurationSettings代表的是具体配置数据中的配置项物理格式的数据 ///核心功能,调用Read()方法,实际的读取由Provider完成 object configurationSettings = storageProviderReader.Read(); if (configurationSettings == null) { return null; } ITransformer transformer = CreateTransformer(sectionName); if (transformer != null) { ///将配置数据由代表物理格式配置数据的类转变为代表应用程序直接访问的配置类 configurationSection = transformer.Deserialize(configurationSettings); } else { configurationSection = configurationSettings; } ConfigurationChangedEventHandler changed = new ConfigurationChangedEventHandler(OnExternalConfigurationChanged); ///增加到缓存中 sections.AddSection(sectionName, configurationSection, changed, storageProviderReader); return configurationSection; } public void WriteConfiguration(string sectionName, object configValue) { ///验证有效性 ValidateSection(sectionName); ///注册写前事件 ConfigurationChangingEventArgs args = CreateConfigurationChangingEventArgs(sectionName, configValue); OnConfigurationChanging(args); if (!args.Cancel) { ///创建编写器 IStorageProviderWriter configStorageWriter = GetConfigurationStorageWriter(sectionName); ///将要保存的值转换成Provider可识别的格式,具体何种格式是由配置元数据决定的 object writeData = GetSerializedDataToWrite(sectionName, configValue); ConfigurationWriterActionCommand writerActionCommand = new ConfigurationWriterActionCommand(configStorageWriter, writeData); ///如果配置节尚不存在就添加此配置数据 if (!sections.ContainsSection(sectionName)) { AddSection(sectionName, configValue, configStorageWriter); } ///如果配置节已存在就更新此配置数据 sections.UpdateSection(sectionName, writerActionCommand, configValue); ///注册写完成事件 ConfigurationChangedEventArgs changedArgs = new ConfigurationChangedEventArgs(configFile.FileName, sectionName); OnConfigurationChanged(changedArgs); } }

   

0
相关文章