它们的定义app.config中间section节点和在执行中使用
2015-07-22 09:02
381 查看
如果现在我们需要在app.config一个节点的在下面的例子中,定义,我们需要如何进行操作?
那么这个节点的各个字段都代表什么意思?section中name指的是你自己定义的这个section的名字。type指的是用于接收这个section中相应字段的类,在程序执行的时候CLR会通过反射将各个字段赋值给这个类的相应属性。
在这里,listeners是一个集合,所以我们要用一个继承自ConfigurationElementCollection的类来进行接收。
通过ConfigurationElementCollection的Attribute才干找到相应的配置文件的节点。之后节点找到了,一切就简单了。这时候我们就相应节点中的单个节点,写ConfigurationElement这个类,把相应的字段相应到相应的属性上边就能够了。可是这里有还有一种情况。
我们怎么去接收这个service.info?非常显然这里我们须要在IntegrationSection添加一个属性,一个直接继承自ConfigurationElement的属性来接收。注意,这里我们也须要给这个属性添加一个Attribute来告诉CRL。在反射的时候。是把哪个字段来赋给这里的属性。那为什么在上一个的样例中。我们没有在EndpointCollection中特别指明节点名字呢?由于你能够看出,listeners下边。每一个节点的名字都是add. 跟这个样例不同。
我们能够这样理解,依据Collection的Atrribute找到了listners,然后我们就用对应的ConfigurationElement来接收即可了,可是我们写这个类的时候,就要用Attribute把每一个属性写清楚。
ConfigurationManager.GetSection("integration.config") as IntegrationSection,这里CLR就会把对应的值给对应的属性。这一句代码是最为关键的代码,是CLR对配置文件进行读取解析,然使用反射来每个字段后,值分配来处理相应的属性。
<configSections> <section name="integration.config" type="UtilityComponent.WinService.Utilities.Config.Integration.IntegrationSection, UtilityComponent.WinService"/> </configSections> <integration.config> <listeners> <add queue="my_queue_Publish" service="PublishService"/> <add queue="my_queue_sub" service="SubscribeService"/> </listeners> </integration.config>
那么这个节点的各个字段都代表什么意思?section中name指的是你自己定义的这个section的名字。type指的是用于接收这个section中相应字段的类,在程序执行的时候CLR会通过反射将各个字段赋值给这个类的相应属性。
在这里,listeners是一个集合,所以我们要用一个继承自ConfigurationElementCollection的类来进行接收。
[NamedSection("integration.config")] public class IntegrationSection : ConfigurationSection { //这个属性是用来接收listeners这个节点集合。 这个类继承自ConfigurationElementCollection. 须要在这个属性上边 //用Attribute的方式表明相应的节点名称,这样在转换的时候,利用反射,才知道去哪个节点找这个值 [ConfigurationProperty("listeners", IsRequired = false)] public EndpointCollection EndpointCollection { get { return (EndpointCollection)this["listeners"]; } } } public class EndpointCollection : ConfigurationElementCollection, IEnumerable<EndpointElement> { protected override ConfigurationElement CreateNewElement() { return new EndpointElement(); } protected override object GetElementKey(ConfigurationElement element) { return ((EndpointElement)element).Queue; } public new IEnumerator<EndpointElement> GetEnumerator() { int count = Count; for (var i = 0; i < count; i++) { yield return BaseGet(i) as EndpointElement; } } } public class EndpointElement : ConfigurationElement { //这里须要表明是哪个字段。执行时才干利用反射把相应字段相应的值放到这个属性中来 [ConfigurationProperty("queue", IsKey = true)] public string Queue { get { return (string)this["queue"]; } set { this["queue"] = value; } } [ConfigurationProperty("service", IsKey = false, IsRequired = false)] public string Service { get { return (string)this["service"]; } set { this["service"] = value; } } public override bool IsReadOnly() { return false; } }ConfigurationElement是最主要的类,ConfigurationElementCollection起到了协调的作用。
通过ConfigurationElementCollection的Attribute才干找到相应的配置文件的节点。之后节点找到了,一切就简单了。这时候我们就相应节点中的单个节点,写ConfigurationElement这个类,把相应的字段相应到相应的属性上边就能够了。可是这里有还有一种情况。
<configSections> <section name="integration.config" type="UtilityComponent.WinService.Utilities.Config.Integration.IntegrationSection, UtilityComponent.WinService"/> </configSections> <integration.config> <listeners> <add queue="my_queue_Publish" service="PublishService"/> <add queue="my_queue_sub" service="SubscribeService"/> </listeners> <service.info name="WMSScenarioService" description="WMS Use case implemented using NVS windows service."/> </integration.config>
我们怎么去接收这个service.info?非常显然这里我们须要在IntegrationSection添加一个属性,一个直接继承自ConfigurationElement的属性来接收。注意,这里我们也须要给这个属性添加一个Attribute来告诉CRL。在反射的时候。是把哪个字段来赋给这里的属性。那为什么在上一个的样例中。我们没有在EndpointCollection中特别指明节点名字呢?由于你能够看出,listeners下边。每一个节点的名字都是add. 跟这个样例不同。
我们能够这样理解,依据Collection的Atrribute找到了listners,然后我们就用对应的ConfigurationElement来接收即可了,可是我们写这个类的时候,就要用Attribute把每一个属性写清楚。
ConfigurationManager.GetSection("integration.config") as IntegrationSection,这里CLR就会把对应的值给对应的属性。这一句代码是最为关键的代码,是CLR对配置文件进行读取解析,然使用反射来每个字段后,值分配来处理相应的属性。
相关文章推荐
- iOS开发多线程同步
- iOS开发 - CALayer图层
- iOS接收null的处理方法
- iOS应用安全开发,你不知道的那些事
- Hibernate中根据实体查询报错Ljava.lang.Object; cannot be。。。
- 黑马66期android学习笔记07-13视频
- java之顶级父类Object
- Android实现登录小demo
- iOS-字符串拼接
- Android实现登录小demo
- android 开发如何做内存优化
- Object-C【01】OC语言简述
- ostringstream , list, iostream 的使用方法
- ios-A+B经典问题
- Android NDK: jni/Android.mk: Cannot find module with tag 'cocos2dx' in import path解决办法
- 黑马66期android学习笔记06-SDK的目录结构
- Android开发技巧——实现底部图标文字的导航栏(已更新)
- ios-NSNotification
- 黑马66期android学习笔记05-SDK的获取
- 黑马66期android学习笔记04-Dalvik VM和JVM的比较