それらの定義app.config中間sectionノードと実行中に使用

4430 ワード

app.configのノードの次の例で定義する必要がある場合は、どのように操作する必要がありますか?
<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は集合なので、C o n f i g u rationElementCollectionから継承されたクラスで受信します.
   [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; } }

コンフィギュレーションElementは最も主要なクラスであり、コンフィギュレーションElementCollectionは協調の役割を果たしている.
コンフィギュレーションElementCollectionのAttributeによって、対応するプロファイルのノードが見つかります.その後ノードが見つかり、すべてが簡単になりました.このとき,対応するノードの中の単一のノードについて,コンフィギュレーションElementというクラスを書き,対応するフィールドを対応する属性の上に対応させることができる.しかし、ここにはもう一つの状況があります.
<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>

どうやってこのサービスを受け取りますか?info?ここでは、コンフィギュレーションElementから直接継承された属性を受信するIntegrationSectionに属性を追加する必要があることは明らかです.ここでは、CRLに伝えるためにこのプロパティにAttributeを追加する必要があります.反射している間に.ここのプロパティにどのフィールドを割り当てるかです.では、なぜ前の例で.EndpointCollectionでノード名を特に指定していませんか?listenersの下が見えるからです各ノードの名前はaddです.この例とは違います.
CollectionのAtrributeに基づいてlistnersを見つけ、対応するConfigurationElementで受信すればよいと理解できますが、このクラスを書くときはAttributeで各属性をはっきり書かなければなりません.
Configurationmanager.GetSection(「integration.config」)as IntegrationSection、ここでCLRは対応する値を対応する属性に与えます.このコードは最も重要なコードであり、CLRがプロファイルを読み取り解析するが、各フィールドに反射を使用した後、値の割り当ては対応する属性を処理する.
本文のブログのオリジナルの文章.ブログは、同意を得ずに転載してはならない.