无论是winform,还是asp.net,如果可以开发成可配置的,就可以大大减少更新程序的次数了,而.net对这方面的支持也很好,是以面向对象方式处理的。
1.配置节点,配置元素。
下面的代码示例是用于处理这样的xml配置片段
<LogHandle> 
        <ReportHandle Use ="true" Interval="1" ManualHandleType="EMAIL"> 
            <ReportTimes> 
                <!--SMS,EMAIL,RICHEMAIL--> 
                <add ID="1" Hour= "8" Minute ="30"  HandleType="EMAIL"/> 
                <add ID="2" Hour= "12" Minute ="0" HandleType="EMAIL"/> 
                <add ID="3" Hour= "17" Minute ="0" HandleType="EMAIL"/> 
            </ReportTimes> 
        </ReportHandle> 
        <ErrorHandle  Use ="true"> 
            <Rules> 
                <!--SMS,EMAIL,MSMQ--> 
                <add ID="1"  Begin= "1" End= "4" HandleType ="MSMQ"/> 
                <!--错误小于等于0~3次 重发消息--> 
                <add ID="2"  Begin= "3" End= "4" HandleType ="EMAIL"/> 
                <!--错误小于等于3~4次 发邮件--> 
                <!--<add ID="3"  Begin= "5" End= "5" HandleType ="SMS"/> 
                --><!--错误小于等于4~5次 发短信--> 
            </Rules> 
        </ErrorHandle>  
</LogHandle>
根据xml片段的结构,应该增加下面这些类。
 

 ConfigSection
ConfigSection
  1 public class LogHandleConfigSection : ConfigurationSection
public class LogHandleConfigSection : ConfigurationSection 
  2
 
   {
{ 
  3
 public LogHandleConfigSection()
      public LogHandleConfigSection()  { }
{ } 
  4
  5 [ConfigurationProperty("ReportHandle")]
      [ConfigurationProperty("ReportHandle")] 
  6 public ReportHandleElement ReportHandle
      public ReportHandleElement ReportHandle 
  7
 
       {
{ 
  8 get
          get 
  9
 
           {
{ 
 10 return (ReportHandleElement)this["ReportHandle"];
              return (ReportHandleElement)this["ReportHandle"]; 
 11 }
          } 
 12 set
          set 
 13
 
           {
{ 
 14 this["ReportHandle"] = value;
              this["ReportHandle"] = value; 
 15 }
          } 
 16 }
      } 
 17
 18 [ConfigurationProperty("ErrorHandle")]
      [ConfigurationProperty("ErrorHandle")] 
 19 public ErrorHandleElement ErrorHandle
      public ErrorHandleElement ErrorHandle 
 20
 
       {
{ 
 21 get
          get 
 22
 
           {
{ 
 23 return (ErrorHandleElement)this["ErrorHandle"];
              return (ErrorHandleElement)this["ErrorHandle"]; 
 24 }
          } 
 25 set
          set 
 26
 
           {
{ 
 27 this["ErrorHandle"] = value;
              this["ErrorHandle"] = value; 
 28 }
          } 
 29 }
      } 
 30 }
  } 
 31
 32 public class ReportHandleElement : ConfigurationElement
  public class ReportHandleElement : ConfigurationElement 
 33
 
   {
{ 
 34 [ConfigurationProperty("Use", IsRequired = true)]
      [ConfigurationProperty("Use", IsRequired = true)] 
 35 public bool Use
      public bool Use 
 36
 
       {
{ 
 37 get
          get 
 38
 
           {
{ 
 39 return (bool)this["Use"];
              return (bool)this["Use"]; 
 40 }
          } 
 41 set
          set 
 42
 
           {
{ 
 43 this["Use"] = value;
              this["Use"] = value; 
 44 }
          } 
 45 }
      } 
 46
 /**//// <summary>
      /**//// <summary> 
 47 /// 表示刷新频率
      /// 表示刷新频率 
 48 /// 有2中使用方式:
      /// 有2中使用方式: 
 49 ///     1.使用interval作为判断依据,这样可能会出现漏洞。
      ///     1.使用interval作为判断依据,这样可能会出现漏洞。 
 50 ///     2.使用interval*2作为判断依据,然后规定每个interval时间内只能有一次响应。
      ///     2.使用interval*2作为判断依据,然后规定每个interval时间内只能有一次响应。 
 51 /// </summary>
      /// </summary> 
 52 [ConfigurationProperty("Interval", IsRequired = true)]
      [ConfigurationProperty("Interval", IsRequired = true)] 
 53 public int Interval
      public int Interval 
 54
 
       {
{ 
 55 get
          get 
 56
 
           {
{ 
 57 return (int)this["Interval"];
              return (int)this["Interval"]; 
 58 }
          } 
 59 set
          set 
 60
 
           {
{ 
 61 this["Interval"] = value;
              this["Interval"] = value; 
 62 }
          } 
 63 }
      } 
 64
 65 [ConfigurationProperty("ReportTimes")]
      [ConfigurationProperty("ReportTimes")] 
 66 public ReportTimeElementCollection ReportTimes
      public ReportTimeElementCollection ReportTimes 
 67
 
       {
{ 
 68 get
          get 
 69
 
           {
{ 
 70 return (ReportTimeElementCollection)this["ReportTimes"];
              return (ReportTimeElementCollection)this["ReportTimes"]; 
 71 }
          } 
 72 set
          set 
 73
 
           {
{ 
 74 this["ReportTimes"] = value;
              this["ReportTimes"] = value; 
 75 }
          } 
 76 }
      } 
 77 [ConfigurationProperty("ManualHandleType")]
      [ConfigurationProperty("ManualHandleType")] 
 78 public string ManualHandleType
      public string ManualHandleType 
 79
 
       {
{ 
 80 get
          get 
 81
 
           {
{ 
 82 return (string)this["ManualHandleType"];
              return (string)this["ManualHandleType"]; 
 83 }
          } 
 84 set
          set 
 85
 
           {
{ 
 86 this["ManualHandleType"] = value;
              this["ManualHandleType"] = value; 
 87 }
          } 
 88 }
      } 
 89 }
  } 
 90
 91 public class ReportTimeElementCollection : ConfigurationElementCollection
  public class ReportTimeElementCollection : ConfigurationElementCollection 
 92
 
   {
{ 
 93
 94 protected override ConfigurationElement CreateNewElement()
      protected override ConfigurationElement CreateNewElement() 
 95
 
       {
{ 
 96 return new ReportTimeElement();
          return new ReportTimeElement(); 
 97 }
      } 
 98
 99 protected override object GetElementKey(ConfigurationElement element)
      protected override object GetElementKey(ConfigurationElement element) 
100
 
       {
{ 
101 return ((ReportTimeElement)element).ID;
          return ((ReportTimeElement)element).ID; 
102 }
      } 
103 }
  } 
104
105 public class ReportTimeElement : ConfigurationElement
  public class ReportTimeElement : ConfigurationElement 
106
 
   {
{ 
107 [ConfigurationProperty("ID", IsKey = true, IsRequired = true)]
      [ConfigurationProperty("ID", IsKey = true, IsRequired = true)] 
108 public int ID
      public int ID 
109
 
       {
{ 
110 get
          get 
111
 
           {
{ 
112 return (int)this["ID"];
              return (int)this["ID"]; 
113 }
          } 
114 set
          set 
115
 
           {
{ 
116 this["ID"] = value;
              this["ID"] = value; 
117 }
          } 
118 }
      } 
119
120 [ConfigurationProperty("Hour")]
      [ConfigurationProperty("Hour")] 
121 public double Hour
      public double Hour 
122
 
       {
{ 
123 get
          get 
124
 
           {
{ 
125 return (double)this["Hour"];
              return (double)this["Hour"]; 
126 }
          } 
127 set
          set 
128
 
           {
{ 
129 this["Hour"] = value;
              this["Hour"] = value; 
130 }
          } 
131 }
      } 
132
133 [ConfigurationProperty("Minute")]
      [ConfigurationProperty("Minute")] 
134 public double Minute
      public double Minute 
135
 
       {
{ 
136 get
          get 
137
 
           {
{ 
138 return (double)this["Minute"];
              return (double)this["Minute"]; 
139 }
          } 
140 set
          set 
141
 
           {
{ 
142 this["Minute"] = value;
              this["Minute"] = value; 
143 }
          } 
144 }
      } 
145
146 [ConfigurationProperty("HandleType")]
      [ConfigurationProperty("HandleType")] 
147 public string HandleType
      public string HandleType 
148
 
       {
{ 
149 get
          get 
150
 
           {
{ 
151 return (string)this["HandleType"];
              return (string)this["HandleType"]; 
152 }
          } 
153 set
          set 
154
 
           {
{ 
155 this["HandleType"] = value;
              this["HandleType"] = value; 
156 }
          } 
157 }
      } 
158
159 }
  } 
160
161 public class ErrorHandleElement : ConfigurationElement
  public class ErrorHandleElement : ConfigurationElement 
162
 
   {
{ 
163 [ConfigurationProperty("Use", IsRequired = true)]
      [ConfigurationProperty("Use", IsRequired = true)] 
164 public bool Use
      public bool Use 
165
 
       {
{ 
166 get
          get 
167
 
           {
{ 
168 return (bool)this["Use"];
              return (bool)this["Use"]; 
169 }
          } 
170 set
          set 
171
 
           {
{ 
172 this["Use"] = value;
              this["Use"] = value; 
173 }
          } 
174 }
      } 
175
176 [ConfigurationProperty("Rules")]
      [ConfigurationProperty("Rules")] 
177 public RuleElementCollection Rules
      public RuleElementCollection Rules 
178
 
       {
{ 
179 get
          get 
180
 
           {
{ 
181 return (RuleElementCollection)this["Rules"];
              return (RuleElementCollection)this["Rules"]; 
182 }
          } 
183 set
          set 
184
 
           {
{ 
185 this["Rules"] = value;
              this["Rules"] = value; 
186 }
          } 
187 }
      } 
188 }
  } 
189
190 public class RuleElementCollection : ConfigurationElementCollection
  public class RuleElementCollection : ConfigurationElementCollection 
191
 
   {
{ 
192
 public RuleElementCollection()
      public RuleElementCollection()  { }
{ } 
193
194 protected override ConfigurationElement CreateNewElement()
      protected override ConfigurationElement CreateNewElement() 
195
 
       {
{ 
196 return new RuleElement();
          return new RuleElement(); 
197 }
      } 
198
199 protected override object GetElementKey(ConfigurationElement element)
      protected override object GetElementKey(ConfigurationElement element) 
200
 
       {
{ 
201 return ((RuleElement)element).ID;
          return ((RuleElement)element).ID; 
202
203 }
      } 
204 }
  } 
205
206 public class RuleElement : ConfigurationElement
  public class RuleElement : ConfigurationElement 
207
 
   {
{ 
208 [ConfigurationProperty("ID", IsKey = true, IsRequired = true)]
      [ConfigurationProperty("ID", IsKey = true, IsRequired = true)] 
209 public int ID
      public int ID 
210
 
       {
{ 
211 get
          get 
212
 
           {
{ 
213 return (int)this["ID"];
              return (int)this["ID"]; 
214 }
          } 
215 set
          set 
216
 
           {
{ 
217 this["ID"] = value;
              this["ID"] = value; 
218 }
          } 
219 }
      } 
220
221 [ConfigurationProperty("Begin")]
      [ConfigurationProperty("Begin")] 
222 public int Begin
      public int Begin 
223
 
       {
{ 
224 get
          get 
225
 
           {
{ 
226 return (int)this["Begin"];
              return (int)this["Begin"]; 
227 }
          } 
228 set
          set 
229
 
           {
{ 
230 this["Begin"] = value;
              this["Begin"] = value; 
231 }
          } 
232 }
      } 
233
234 [ConfigurationProperty("End")]
      [ConfigurationProperty("End")] 
235 public int End
      public int End 
236
 
       {
{ 
237 get
          get 
238
 
           {
{ 
239 return (int)this["End"];
              return (int)this["End"]; 
240 }
          } 
241 set
          set 
242
 
           {
{ 
243 this["End"] = value;
              this["End"] = value; 
244 }
          } 
245 }
      } 
246
247 [ConfigurationProperty("HandleType")]
      [ConfigurationProperty("HandleType")] 
248 public string HandleType
      public string HandleType 
249
 
       {
{ 
250 get
          get 
251
 
           {
{ 
252 return (string)this["HandleType"];
              return (string)this["HandleType"]; 
253 }
          } 
254 set
          set 
255
 
           {
{ 
256 this["HandleType"] = value;
              this["HandleType"] = value; 
257 }
          } 
258 }
      } 
259 }
  }
260
 
2.如果在xml中声明配置节点
<configSections> 
        <section name="LogHandle" type="WMSJIEKOUDao.BLL.Configuration.LogHandleConfigSection,WMSJIEKOUDao" /> 
</configSections>
3.程序加载方式
config = (LogHandleConfigSection)ConfigurationManager.GetSection("LogHandle");
循环处理
foreach (RuleElement element in config.ErrorHandle.Rules) 
           { 
               if (count >= element.Begin && count <= element.End) 
               { 
                   errorHandler = ErrorHandlerFactory.GetErrorHandler(element.HandleType); 
                   errorHandler.Handle(curErrorLog); 
               } 
           }
 
  这样这个配置模块的基础部分就开发完了,但是还是有几个问题需要研究一下
1.如何处理上面的HandleType的内容,在实际使用的时候,是使用枚举,类型,还是字符串?
answer:
        使用枚举 或者使用字符串都可以,本来想研究一下FormsAuthenticationModule,这些.net标准模块是怎么处理config的,结果发现.net使用的方式是直接处理xmlnode。
2.如何处理isrequire的情况,如果没有某一个元素,那么怎么处理,怎么判断
answer:
3.config的提示文档,xsd是如何创建的。
answer: 可以参考一些现成的比如ibatis里面的
 

 xsd
xsd
<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema 
targetNamespace="http://ibatis.apache.org/dataAccess" 
elementFormDefault="qualified" 
xmlns:mstns="http://tempuri.org/XMLSchema.xsd" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns="http://ibatis.apache.org/dataAccess" 
xmlns:vs="http://schemas.microsoft.com/Visual-Studio-Intellisense" 
vs:friendlyname="iBATIS.NET DataAccess file Configuration Schema" 
vs:ishtmlschema="false" 
vs:iscasesensitive="true" 
vs:requireattributequotes="true" 
vs:defaultnamespacequalifier="" 
vs:defaultnsprefix="" > 
    <xs:element name="providers"> 
        <xs:complexType> 
            <xs:attribute name="resource" type="xs:string"/> 
            <xs:attribute name="url" type="xs:string"/> 
            <xs:attribute name="embedded" type="xs:string"/> 
        </xs:complexType> 
    </xs:element> 
    <xs:element name="context"> 
        <xs:complexType> 
            <xs:sequence> 
                <xs:element ref="properties" minOccurs="0"/> 
                <xs:element ref="database"/> 
                <xs:element ref="daoSessionHandler" minOccurs="0"/> 
                <xs:element ref="daoFactory"/> 
            </xs:sequence> 
            <xs:attribute name="id" type="xs:string" use="required"/> 
            <xs:attribute name="default" type="xs:boolean"/> 
        </xs:complexType> 
    </xs:element> 
    <xs:element name="dao"> 
        <xs:complexType> 
            <xs:attribute name="interface" type="xs:string" use="required"/> 
            <xs:attribute name="implementation" type="xs:string" use="required"/> 
        </xs:complexType> 
    </xs:element> 
    <xs:element name="daoConfig"> 
        <xs:complexType> 
            <xs:sequence> 
                <xs:element ref="daoSessionHandlers" minOccurs="0"/> 
                <xs:element ref="providers" minOccurs="0"  maxOccurs="1"/> 
                <xs:element ref="context" maxOccurs="unbounded"/> 
            </xs:sequence> 
        </xs:complexType> 
    </xs:element> 
    <xs:element name="daoSessionHandlers"> 
        <xs:complexType> 
            <xs:sequence> 
                <xs:element ref="handler"/> 
            </xs:sequence> 
        </xs:complexType> 
    </xs:element> 
    <xs:element name="handler"> 
        <xs:complexType> 
            <xs:simpleContent> 
                <xs:extension base="xs:string"> 
                    <xs:attribute name="id" type="xs:string" use="required"/> 
                    <xs:attribute name="implementation" type="xs:string" use="required"/> 
                </xs:extension> 
            </xs:simpleContent> 
        </xs:complexType> 
    </xs:element> 
    <xs:element name="daoFactory"> 
        <xs:complexType> 
            <xs:sequence> 
                <xs:element ref="dao" minOccurs="1" maxOccurs="unbounded"/> 
            </xs:sequence> 
        </xs:complexType> 
    </xs:element> 
    <xs:element name="daoSessionHandler"> 
        <xs:complexType> 
            <xs:sequence> 
                <xs:element ref="property" maxOccurs="unbounded"/> 
            </xs:sequence> 
            <xs:attribute name="id" type="xs:string" use="required"/> 
        </xs:complexType> 
    </xs:element> 
    <xs:element name="dataSource"> 
        <xs:complexType> 
            <xs:attribute name="name" type="xs:string" use="required"/> 
            <xs:attribute name="connectionString" type="xs:string" use="required"/> 
        </xs:complexType> 
    </xs:element> 
    <xs:element name="database"> 
        <xs:complexType> 
            <xs:sequence> 
                <xs:element ref="provider" minOccurs="0"/> 
                <xs:element ref="dataSource"/> 
            </xs:sequence> 
        </xs:complexType> 
    </xs:element> 
    <xs:element name="properties"> 
        <xs:complexType> 
            <xs:attribute name="resource" type="xs:string"/> 
            <xs:attribute name="url" type="xs:string"/> 
            <xs:attribute name="embedded" type="xs:string"/> 
        </xs:complexType> 
    </xs:element> 
    <xs:element name="property"> 
        <xs:complexType> 
            <xs:attribute name="name" type="xs:string" use="required"/> 
            <xs:attribute name="value" type="xs:string" use="required"/> 
        </xs:complexType> 
    </xs:element> 
    <xs:element name="provider"> 
        <xs:complexType> 
            <xs:attribute name="name" type="xs:string" use="required"/> 
        </xs:complexType> 
    </xs:element> 
</xs:schema>
4.如果加入验证
answer:使用验证特性。