• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
多莱特~梦未醒,再出发

行路难,行路难,多歧路,今安在。

长风破浪会有时,直挂云帆济沧海。

博客园    首页    新随笔       管理     

配置模块开发(原创)

无论是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
  1public class LogHandleConfigSection : ConfigurationSection 
  2  { 
  3      public LogHandleConfigSection() { } 
  4
  5      [ConfigurationProperty("ReportHandle")] 
  6      public ReportHandleElement ReportHandle 
  7      { 
  8          get 
  9          { 
 10              return (ReportHandleElement)this["ReportHandle"]; 
 11          }
 
 12          set 
 13          { 
 14              this["ReportHandle"] = value; 
 15          }
 
 16      }
 
 17
 18      [ConfigurationProperty("ErrorHandle")] 
 19      public ErrorHandleElement ErrorHandle 
 20      { 
 21          get 
 22          { 
 23              return (ErrorHandleElement)this["ErrorHandle"]; 
 24          }
 
 25          set 
 26          { 
 27              this["ErrorHandle"] = value; 
 28          }
 
 29      }
 
 30  }
 
 31
 32  public class ReportHandleElement : ConfigurationElement 
 33  { 
 34      [ConfigurationProperty("Use", IsRequired = true)] 
 35      public bool Use 
 36      { 
 37          get 
 38          { 
 39              return (bool)this["Use"]; 
 40          }
 
 41          set 
 42          { 
 43              this["Use"] = value; 
 44          }
 
 45      }
 
 46      /**//// <summary> 
 47      /// 表示刷新频率 
 48      /// 有2中使用方式: 
 49      ///     1.使用interval作为判断依据,这样可能会出现漏洞。 
 50      ///     2.使用interval*2作为判断依据,然后规定每个interval时间内只能有一次响应。 
 51      /// </summary> 

 52      [ConfigurationProperty("Interval", IsRequired = true)] 
 53      public int Interval 
 54      { 
 55          get 
 56          { 
 57              return (int)this["Interval"]; 
 58          }
 
 59          set 
 60          { 
 61              this["Interval"] = value; 
 62          }
 
 63      }
 
 64
 65      [ConfigurationProperty("ReportTimes")] 
 66      public ReportTimeElementCollection ReportTimes 
 67      { 
 68          get 
 69          { 
 70              return (ReportTimeElementCollection)this["ReportTimes"]; 
 71          }
 
 72          set 
 73          { 
 74              this["ReportTimes"] = value; 
 75          }
 
 76      }
 
 77      [ConfigurationProperty("ManualHandleType")] 
 78      public string ManualHandleType 
 79      { 
 80          get 
 81          { 
 82              return (string)this["ManualHandleType"]; 
 83          }
 
 84          set 
 85          { 
 86              this["ManualHandleType"] = value; 
 87          }
 
 88      }
 
 89  }
 
 90
 91  public class ReportTimeElementCollection : ConfigurationElementCollection 
 92  { 
 93
 94      protected override ConfigurationElement CreateNewElement() 
 95      { 
 96          return new ReportTimeElement(); 
 97      }
 
 98
 99      protected override object GetElementKey(ConfigurationElement element) 
100      { 
101          return ((ReportTimeElement)element).ID; 
102      }
 
103  }
 
104
105  public class ReportTimeElement : ConfigurationElement 
106  { 
107      [ConfigurationProperty("ID", IsKey = true, IsRequired = true)] 
108      public int ID 
109      { 
110          get 
111          { 
112              return (int)this["ID"]; 
113          }
 
114          set 
115          { 
116              this["ID"] = value; 
117          }
 
118      }
 
119
120      [ConfigurationProperty("Hour")] 
121      public double Hour 
122      { 
123          get 
124          { 
125              return (double)this["Hour"]; 
126          }
 
127          set 
128          { 
129              this["Hour"] = value; 
130          }
 
131      }
 
132
133      [ConfigurationProperty("Minute")] 
134      public double Minute 
135      { 
136          get 
137          { 
138              return (double)this["Minute"]; 
139          }
 
140          set 
141          { 
142              this["Minute"] = value; 
143          }
 
144      }
 
145
146      [ConfigurationProperty("HandleType")] 
147      public string HandleType 
148      { 
149          get 
150          { 
151              return (string)this["HandleType"]; 
152          }
 
153          set 
154          { 
155              this["HandleType"] = value; 
156          }
 
157      }
 
158
159  }
 
160
161  public class ErrorHandleElement : ConfigurationElement 
162  { 
163      [ConfigurationProperty("Use", IsRequired = true)] 
164      public bool Use 
165      { 
166          get 
167          { 
168              return (bool)this["Use"]; 
169          }
 
170          set 
171          { 
172              this["Use"] = value; 
173          }
 
174      }
 
175
176      [ConfigurationProperty("Rules")] 
177      public RuleElementCollection Rules 
178      { 
179          get 
180          { 
181              return (RuleElementCollection)this["Rules"]; 
182          }
 
183          set 
184          { 
185              this["Rules"] = value; 
186          }
 
187      }
 
188  }
 
189
190  public class RuleElementCollection : ConfigurationElementCollection 
191  { 
192      public RuleElementCollection() { } 
193
194      protected override ConfigurationElement CreateNewElement() 
195      { 
196          return new RuleElement(); 
197      }
 
198
199      protected override object GetElementKey(ConfigurationElement element) 
200      { 
201          return ((RuleElement)element).ID; 
202
203      }
 
204  }
 
205
206  public class RuleElement : ConfigurationElement 
207  { 
208      [ConfigurationProperty("ID", IsKey = true, IsRequired = true)] 
209      public int ID 
210      { 
211          get 
212          { 
213              return (int)this["ID"]; 
214          }
 
215          set 
216          { 
217              this["ID"] = value; 
218          }
 
219      }
 
220
221      [ConfigurationProperty("Begin")] 
222      public int Begin 
223      { 
224          get 
225          { 
226              return (int)this["Begin"]; 
227          }
 
228          set 
229          { 
230              this["Begin"] = value; 
231          }
 
232      }
 
233
234      [ConfigurationProperty("End")] 
235      public int End 
236      { 
237          get 
238          { 
239              return (int)this["End"]; 
240          }
 
241          set 
242          { 
243              this["End"] = value; 
244          }
 
245      }
 
246
247      [ConfigurationProperty("HandleType")] 
248      public string HandleType 
249      { 
250          get 
251          { 
252              return (string)this["HandleType"]; 
253          }
 
254          set 
255          { 
256              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
<?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:使用验证特性。

posted @ 2009-11-04 12:54  Young跑跑  阅读(353)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3