SOA Framework 开发使用手册
1 Configuration
1.1 模块概述
在公共组件库中的MCS.Library.Configuration 命名空间下包含了框架中实现应用程序配置的读取和写入的功能模块,该模块有如下特点:
? ? ? ?
允许一台服务器上多个应用共享一个全局配置信息
允许一台服务器上Web和Windows应用共享一个全局配置信息 允许多台服务器上的应用共享一个全局配置信息 充分利用了公共组件库的Cache管理
1.2 .NET中的Configuration
.NET通过XML格式的文件Machine.Config和Web.Config/App.Config来完成对应用程序的配置。整个服务器的配置信息保存在Machine.Config文件中,它包含了运行所有.NET程序,服务器需要的所有配置信息。Web.Config/App.Config从Machine.Config继承和重写部分配置信息。
我们来看一下Machine.Config中定义的appSettings,type属性说明在.NET中以System.Configuration.AppSettingsSection这个类型来描述它。
在. NET中我们使用ConfigurationManager来获取ConfigurationSection,ConfigurationSection是配置信息中的配置节和内存中的对象的一个映射,通过ConfigurationSection可以去定义和管理一组相关的配置信息。
ConfigurationSection appSetting = 我们可以为每一个应用程序配置单独的配置文件,如果有些配置信息是多个应用程序共享的,那么我们可以把这些配置信息放到Machine.config中,因为应用程序的配置信息继承自Machine.Config,这样就可以解决我们的问题了。但是这样做也同样存在问题,Machine.config是属于Server级别的,如果修改了它,可能会影响到所有寄宿在这台服务器上的.NET应用程序,可以即共享了配置,又不影响其他的应用程序吗?
?《SOA Framework》
1
ConfigurationManager.GetSection(\) as ConfigurationSection; SOA Framework 开发使用手册
1.3 框架中的Configuration
在框架中我们使用一个映射文件和一个共享全局配置文件来解决共享配置的问题。
1.3.1 映射文件
在. NET中我们使用ConfigurationManager来获取ConfigurationSection来获取配置信息, 在框架中我们只是换种写法,用ConfigurationBroker来获取配置信息。
那么如何可以做到让多个应用程序共享配置信息呢,首先我们修改一下Web.config中AppSetting配置节的信息。添加一个指向物理文件的信息
ConfigurationBroker.GetSection(\); ConfigMapping.config这个文件究竟是做什么用的呢?我们先来看看它的结构
ConfigMapping中定义了sourceMappings,它以框架中的MetaConfigurationSource- InstanceSection这个类型来描述。sourceMappings中描述了共享配置文件的信息, 与appSettings一样,指向了共享配置文件的物理路径,要注意Mode这个属性。
name:全局配置文件的标识名称,此名称不可重复 Path:全局配置文件路径,可以是绝对路径或相对路径
mode:调用全局配置文件的程序的宿主类型,有web,win两种方式,框架在加载配置时只选择mode为win或web的全局配置文件。
如果一个Web程序和一个Win程序共享配置信息,只需要添加一个配置元素即可。
?《SOA Framework》
2
SOA Framework 开发使用手册
这样我们就可以为应用程序添加共享配置信息了。共享配置文件也是以Section组成的。
public class TestSection:ConfigurationSection { [ConfigurationProperty(\)] public string Country { get {return this[\].ToString();} } [ConfigurationProperty(\)] public SubTestSettingCollection SubTestSettings { get {return (SubTestSettingCollection)this[\];} } } TestSection中一般会存放一组相关的配置信息,通常是一个集合,这种集合我们也需要一个类来描述它,在这里我们定义了 SubTestSettingCollection来描述这个集合,它派生自
system. Configuration. ConfigurationElementCollection。
public class SubTestSettingCollection : ConfigurationElementCollection { /// 重写基类抽象方法,以CityName获取配置元素 protected override object GetElementKey(ConfigurationElement element) { return ((SubTestSetting)element).CityName; } } 集合中的元素就是我们想要的配置信息了,要读取这些信息.NET提供了ConfigurationElement这个基类,只要派生这个类,就可以很方便的读取信息。
?《SOA Framework》 3
SOA Framework 开发使用手册
配置文件写法
public sealed class SubTestSetting : ConfigurationElement { [ConfigurationProperty(\)] public string CityName { get {return (string)this[\];} } } 1.3.3 调用方式
在框架中对所有的Section的访问都通过ConfigurationBroker来进行。
TestSection section = ConfigurationBroker.GetSection(\) as TestSection; string country = section.Country; SubTestSettingCollection collection = section.SubTestSettings; foreach (SubTestSetting subtest in collection) { string str = subtest.CityName; }
1.4 实现原理
?《SOA Framework》 4
SOA Framework 开发使用手册
当首次向框架提出一个获得Section的请求后,获取web.Config/App.config和
machine.config,查找Appsetting节点中的MCS.MetaConfiguration 元素的Mapping.config路径。如果有则读取Mapping.config文件,根据Mapping文件的Framework.config路径读取Framework.config,最后根据宿主环境替换machine.config的指向。遍历最终的Config,找到请求的Section并缓存,文件下一次读取此Section时,会直接从SectionCache中取得,如果是其他Section,则重复以上过程。
1.5 附录
1.5.1 NamedConfigurationElement 1.5.2 ServerInfoConfigurationElement 1.5.3 TypeConfigurationElement 1.5.4 IdentityConfigurationElement 1.5.5 UriConfigurationElement
?《SOA Framework》 5