它们的定义app.config中间section节点和在执行中使用
如果現(xiàn)在我們需要在app.config一個(gè)節(jié)點(diǎn)的在下面的例子中,定義,我們需要如何進(jìn)行操作?
<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>那么這個(gè)節(jié)點(diǎn)的各個(gè)字段都代表什么意思?section中name指的是你自己定義的這個(gè)section的名字。type指的是用于接收這個(gè)section中相應(yīng)字段的類,在程序執(zhí)行的時(shí)候CLR會(huì)通過反射將各個(gè)字段賦值給這個(gè)類的相應(yīng)屬性。
在這里,listeners是一個(gè)集合,所以我們要用一個(gè)繼承自ConfigurationElementCollection的類來進(jìn)行接收。
[NamedSection("integration.config")]public class IntegrationSection : ConfigurationSection{//這個(gè)屬性是用來接收listeners這個(gè)節(jié)點(diǎn)集合。這個(gè)類繼承自ConfigurationElementCollection. 須要在這個(gè)屬性上邊 //用Attribute的方式表明相應(yīng)的節(jié)點(diǎn)名稱,這樣在轉(zhuǎn)換的時(shí)候,利用反射,才知道去哪個(gè)節(jié)點(diǎn)找這個(gè)值 [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 { //這里須要表明是哪個(gè)字段。執(zhí)行時(shí)才干利用反射把相應(yīng)字段相應(yīng)的值放到這個(gè)屬性中來 [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起到了協(xié)調(diào)的作用。通過ConfigurationElementCollection的Attribute才干找到相應(yīng)的配置文件的節(jié)點(diǎn)。之后節(jié)點(diǎn)找到了,一切就簡(jiǎn)單了。這時(shí)候我們就相應(yīng)節(jié)點(diǎn)中的單個(gè)節(jié)點(diǎn),寫ConfigurationElement這個(gè)類,把相應(yīng)的字段相應(yīng)到相應(yīng)的屬性上邊就能夠了。可是這里有還有一種情況。
<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>我們?cè)趺慈ソ邮者@個(gè)service.info?非常顯然這里我們須要在IntegrationSection添加一個(gè)屬性,一個(gè)直接繼承自ConfigurationElement的屬性來接收。注意,這里我們也須要給這個(gè)屬性添加一個(gè)Attribute來告訴CRL。在反射的時(shí)候。是把哪個(gè)字段來賦給這里的屬性。那為什么在上一個(gè)的樣例中。我們沒有在EndpointCollection中特別指明節(jié)點(diǎn)名字呢?由于你能夠看出,listeners下邊。每一個(gè)節(jié)點(diǎn)的名字都是add. 跟這個(gè)樣例不同。
我們能夠這樣理解,依據(jù)Collection的Atrribute找到了listners,然后我們就用對(duì)應(yīng)的ConfigurationElement來接收即可了,可是我們寫這個(gè)類的時(shí)候,就要用Attribute把每一個(gè)屬性寫清楚。
ConfigurationManager.GetSection("integration.config") as IntegrationSection,這里CLR就會(huì)把對(duì)應(yīng)的值給對(duì)應(yīng)的屬性。這一句代碼是最為關(guān)鍵的代碼,是CLR對(duì)配置文件進(jìn)行讀取解析,然使用反射來每個(gè)字段后,值分配來處理相應(yīng)的屬性。
版權(quán)聲明:本文博客原創(chuàng)文章。博客,未經(jīng)同意,不得轉(zhuǎn)載。
轉(zhuǎn)載于:https://www.cnblogs.com/zfyouxi/p/4666316.html
總結(jié)
以上是生活随笔為你收集整理的它们的定义app.config中间section节点和在执行中使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 漫威死亡女神和灭霸(漫威死亡女神)
- 下一篇: Nginx TCP代理