• .NET:自定义配置节


    背景

    对于编译型应用程序来说,参数化程序行为是非常有必要的,.NET有其标准的配置方法,我们可以可以扩展。

    示例

    代码

      1 using System;
      2 using System.Collections;
      3 using System.Text;
      4 using System.Configuration;
      5 using System.Xml;
      6 
      7 namespace YEA.Infrastructure.Gateway.Config
      8 {
      9     public enum ExchangeType { direct, topic, fanout };
     10     public class Exchange : ConfigurationElement
     11     {
     12         [ConfigurationProperty("name", DefaultValue = "", IsRequired = true)]
     13         public string Name
     14         {
     15             get { return (string) this["name"]; }
     16             set { this["name"] = value; }
     17         }
     18         [ConfigurationProperty("connection", DefaultValue = "", IsRequired = true)]
     19         public string Connection
     20         {
     21             get { return (string)this["connection"]; }
     22             set { this["connection"] = value; }
     23         }
     24         [ConfigurationProperty("type", DefaultValue = "direct", IsRequired = true)]
     25         public ExchangeType Type
     26         {
     27             get { return (ExchangeType)this["type"]; }
     28             set { this["type"] = value; }
     29         }
     30         [ConfigurationProperty("autodelete", DefaultValue= true, IsRequired = false)]
     31         public bool AutoDelete
     32         {
     33             get { return (bool)this["autodelete"]; }
     34             set { this["autodelete"] = value; }
     35         }
     36         [ConfigurationProperty("durable", DefaultValue = false, IsRequired = false)]
     37         public bool Durable
     38         {
     39             get { return (bool)this["durable"]; }
     40             set { this["durable"] = value; }
     41         }
     42     }
     43     public class ExchangeCollection : ConfigurationElementCollection
     44     {
     45         public override ConfigurationElementCollectionType CollectionType
     46         {
     47             get
     48             {
     49                 return ConfigurationElementCollectionType.AddRemoveClearMap;
     50             }
     51         }
     52         protected override ConfigurationElement CreateNewElement()
     53         {
     54             return new Exchange();
     55         }
     56         protected override object GetElementKey(ConfigurationElement element)
     57         {
     58             return ((Exchange)element).Name;
     59         }
     60         public new string AddElementName
     61         {
     62             get { return base.AddElementName; }
     63             set { base.AddElementName = value; }
     64         }
     65         public new string ClearElementName
     66         {
     67             get { return base.ClearElementName; }
     68             set { base.ClearElementName = value; }
     69 
     70         }
     71 
     72         public new string RemoveElementName
     73         {
     74             get { return base.RemoveElementName; }
     75         }
     76 
     77         public new int Count
     78         {
     79             get { return base.Count; }
     80         }
     81 
     82 
     83         public Exchange this[int index]
     84         {
     85             get
     86             {
     87                 return (Exchange)BaseGet(index);
     88             }
     89             set
     90             {
     91                 if (BaseGet(index) != null)
     92                 {
     93                     BaseRemoveAt(index);
     94                 }
     95                 BaseAdd(index, value);
     96             }
     97         }
     98 
     99         new public Exchange this[string Name]
    100         {
    101             get { return (Exchange)BaseGet(Name); }
    102         }
    103 
    104         public int IndexOf(Exchange exchange)
    105         {
    106             return BaseIndexOf(exchange);
    107         }
    108 
    109         public void Add(Exchange exchange)
    110         {
    111             BaseAdd(exchange);
    112             // Add custom code here.
    113         }
    114 
    115         protected override void BaseAdd(ConfigurationElement element)
    116         {
    117             BaseAdd(element, false);
    118             // Add custom code here.
    119         }
    120 
    121         public void Remove(Exchange exchange)
    122         {
    123             if (BaseIndexOf(exchange) >= 0)
    124                 BaseRemove(exchange.Name);
    125         }
    126 
    127         public void RemoveAt(int index)
    128         {
    129             BaseRemoveAt(index);
    130         }
    131 
    132         public void Remove(string name)
    133         {
    134             BaseRemove(name);
    135         }
    136 
    137         public void Clear()
    138         {
    139             BaseClear();
    140             // Add custom code here.
    141         }
    142     }
    143     public class AMQPObjectsDeclarationSection : ConfigurationSection
    144     {
    145         [ConfigurationProperty("ExchangeList", IsDefaultCollection = false)]
    146         public ExchangeCollection ExchangeList
    147         {
    148             get
    149             {
    150                 ExchangeCollection exchanges = (ExchangeCollection)this["ExchangeList"];
    151                 return exchanges;
    152             }
    153         }
    154         [ConfigurationProperty("QueueList", IsDefaultCollection = false)]
    155         public QueueCollection QueueList
    156         {
    157             get
    158             {
    159                 QueueCollection queue = (QueueCollection)this["QueueList"];
    160                 return queue;
    161             }
    162         }
    163         [ConfigurationProperty("BindingList", IsDefaultCollection = false)]
    164         public BindingCollection BindingList
    165         {
    166             get
    167             {
    168                 BindingCollection binding = (BindingCollection)this["BindingList"];
    169                 return binding;
    170             }
    171         }
    172 
    173         protected override void DeserializeSection(System.Xml.XmlReader reader)
    174         {
    175             base.DeserializeSection(reader);
    176             // You can add custom processing code here.
    177         }
    178 
    179         protected override string SerializeSection(
    180             ConfigurationElement parentElement,
    181             string name, ConfigurationSaveMode saveMode)
    182         {
    183             string s =
    184                 base.SerializeSection(parentElement,
    185                 name, saveMode);
    186             // You can add custom processing code here.
    187             return s;
    188         }
    189 
    190     }
    191 }

    最终XML配置

    App.config

     1 <?xml version="1.0" encoding="utf-8" ?>
     2 <configuration>
     3   <configSections>
     4     <sectionGroup name="AMQPConnection">
     5       <section name="ConnectionSettings"
     6                      type="YEA.Infrastructure.Gateway.Config.ConnectionSection, YEA.Infrastructure.Gateway"></section>
     7     </sectionGroup>
     8     <sectionGroup name="AMQPAdmin">
     9       <section name="AMQPObjectsDeclaration"
    10                type="YEA.Infrastructure.Gateway.Config.AMQPObjectsDeclarationSection, YEA.Infrastructure.Gateway"
    11                allowLocation="true"
    12                allowDefinition="Everywhere"></section>
    13     </sectionGroup>
    14 
    15   </configSections>
    16   <AMQPConnection >
    17     <ConnectionSettings configSource="Configamqp.connection.config"/>
    18   </AMQPConnection>
    19   <AMQPAdmin>
    20     <AMQPObjectsDeclaration configSource="Configamqp.objects.config"/>
    21   </AMQPAdmin>
    22   <appSettings >
    23     <add key="SleepTime" value="0"></add>
    24     <!--Mode = ["Receiver","Transmitter"]-->
    25     <add key="Mode" value="Receiver"></add>
    26     <add key="DummyFile" value="C:logsYEAMonitorLogService.txt"></add>
    27     <add key="notificationToEmail" value="ruben.rotteveel@chamberlain.com"/>
    28     <add key="notificationFromEmail" value="webmaster@chamberlain.com"/>
    29   </appSettings>
    30 </configuration>

    amqp.connection.config

     1 <?xml version="1.0" encoding="utf-8" ?>
     2 <ConnectionSettings>
     3   <ConnectionList>
     4     <add name="Connection" server="localhost" username="guest" password="guest"></add>  
     5   </ConnectionList>
     6   <PublisherList>
     7     <add name="orderPublisher" connection="Connection" exchange="orders" ></add>
     8     <add name="notificationPublisher" connection="Connection" exchange="notificationExchange"></add>
     9     <add name="logPublisher" connection="Connection" exchange="logExchange"></add>
    10   </PublisherList>
    11   <AsyncReceiverList>
    12     <add name="orderReceiver" connection="Connection" queue="uk_orders, marketingemails, Accounting, CustomerService" maxthreads="40"></add>
    13     <add name="notificationReceiver" connection="Connection" queue="notificationQueue" maxthreads ="1"></add>
    14     <add name="logReceiver" connection="Connection" queue="logQueue" maxthreads ="1"></add>
    15   </AsyncReceiverList>
    16 </ConnectionSettings>

    amqp.objects.config

     1 <?xml version="1.0" encoding="utf-8" ?>
     2 <AMQPObjectsDeclaration>
     3   <ExchangeList>
     4     <add name="orders" connection="Connection" type="topic" autodelete="false" durable="true"></add>
     5     <add name="shipments" connection="Connection" type ="topic" autodelete="false" durable="true"></add>
     6     <add name="logExchange" connection="Connection" type="topic" autodelete="false" durable="true"></add>
     7     <add name="notificationExchange" connection="Connection" type="topic" autodelete="false" durable="true"></add>
     8   </ExchangeList>
     9   <QueueList>
    10     <add name="uk_orders" connection="Connection" autodelete="false" durable="true"></add>
    11     <add name="us_orders" connection="Connection" autodelete="false" durable="true"></add>
    12     <add name="marketingemails" connection="Connection" autodelete ="false" durable="true"></add>
    13     <add name="Accounting" connection="Connection" autodelete="false" durable="true" ></add>
    14     <add name="CustomerService" connection="Connection" autodelete="false" durable="true" ></add>
    15     <add name="logQueue" connection="Connection" autodelete="false" durable="true"></add>
    16     <add name="notificationQueue" connection="Connection" autodelete="false" durable="true"></add>
    17   </QueueList>
    18   <BindingList>
    19     <add queue="uk_orders" connection="Connection" exchange="orders" subscriptionkey="order.uk.#"></add>
    20     <add queue="us_orders" connection="Connection" exchange="orders" subscriptionkey="order.us.#"></add>
    21     <add queue="marketingemails" connection="Connection" exchange="shipments" subscriptionkey="#" ></add>
    22     <add queue="marketingemails" connection="Connection" exchange="orders" subscriptionkey="#" ></add>
    23     <add queue="Accounting" connection="Connection" exchange="shipments" subscriptionkey="#" ></add>
    24     <add queue="Accounting" connection="Connection" exchange="orders" subscriptionkey="#" ></add>
    25     <add queue="CustomerService" connection="Connection" exchange="shipments" subscriptionkey="#" ></add>
    26     <add queue="CustomerService" connection="Connection" exchange="orders" subscriptionkey="#" ></add>
    27     <add queue="logQueue" connection="Connection" exchange="logExchange" subscriptionkey="#"></add>
    28     <add queue="notificationQueue" connection="Connection" exchange="notificationExchange" subscriptionkey="#"></add>
    29   </BindingList>
    30 </AMQPObjectsDeclaration>

    读取配置

    1             var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    2             var objects = config.GetSection("AMQPAdmin/AMQPObjectsDeclaration") as AMQPObjectsDeclarationSection;

    备注

    简单的使用配置并不是最好的方式,比如:在控制台程序中,最好提供两种方式:通过命令行参数和配置结合,然后采用适当的优先级处理。另外,采用JSON配置可能会更简单一点。

  • 相关阅读:
    最值得你学习的编程语言
    【收藏】程序员的资料库--技术文档、视频教程、电子书
    pig 安装
    MySQL导入.sql文件及常用命令
    win7下使用 EasyBCD 硬盘安装centOS
    Linux系统分区
    Hadoop实战教程视频
    中医药小分子和表观遗传重编程
    OpenSSL
    iOS 判断网络连接状态之重写Reachability
  • 原文地址:https://www.cnblogs.com/happyframework/p/3930721.html
Copyright © 2020-2023  润新知