閱讀335 返回首頁    go 阿裏雲 go 技術社區[雲棲]


為自定義配置的編輯提供”智能感知”的支持

當我們在設計一個框架的時候,必然會涉及一係列的配置。為了讓使用者更好地使用你提供的框架,讓他們能夠容易地維護這些配置是一項基本的要求。對於一些配置過於複雜的框架,比如EnterLib,比如WCF,往往會提供一個配置的工具。但是,不過這樣的配置工具是否提供,手工編譯配置文件是在所難免的。如果在通過VS編輯配置的時候,能夠提供智能感知和提示性描述的支持,這無疑會使配置的編輯變得非常的容易。這裏是一個簡單的例子。

一、配置文件的結構

假設我們設計一個MessageGenerator的組件,用於生成程序我們需要的文本消息,比如驗證控件的驗證消息,異常的消息等。消息的內容根據需要可以保存在數據庫中或者是XML文件中,並且采用不同模式(粒度)的緩存(None、Single、Category和All)。我們采用插件式的設計,定義一個IMessageProvider接口用於從數據源中獲取消息列表,兩個具體的DbMessageProvider和XmlMessageProvider實現了這個接口。具體采用那個MessageProvider,通過配置來決定(defaultProvider),配置結構如下所示:

   1: <?xml version="1.0"?>
   2: <configuration>
   3:   <configSections>
   4:     <section name="artech.messages" type="Artech.Messages.MessagesSetting, Artech.Messages"/>
   5:   </configSections> 
   6:   <artech.messages defaultProvider="DbProvider" cachingMode="None">
   7:     <providers>
   8:       <add name="DbProvider"  type="Artech.Messages.DbMessageProvider, Artech.Messages" 
   9:            connectionString="" applicationName=""  />
  10:       <add name="XmlProvider" type="Artech.Messages.XmlMessageProvider, Artech.Messages" 
  11:            source="~/Messages.xml"/>      
  12:     </providers>
  13:   </artech.messages>  
  14: </configuration>

二、為配置定義XSD

為了在VS中編輯配置文件的時候獲得智能感知的支持,我們需要為它定義XSD。整個XSD如下所示,結構比較清晰。不過在這裏有幾點需要強調:

  • 我們通過采用<xs:documentation>節點定義一些表述性的文字。當你通過VS編輯配置文件的時候,針對當前配置節點定義的這些文字將會以Tips的形式顯示出來;
  • 在定義MessageProvider的schema的時候,我們將針對所有預定義MessageProvider的配置屬性都定義出來(DbMessageProvider的applicationName和connectionStringName,以及XmlMessageProvider的source)。如果這些配置屬性不是對於所有的MessageProvider都是必須的(比如name和type),將它們定義成可選屬性;
  • 對於一些枚舉,或者限定在某個列表範圍內固定的值,通過<xs:restriction>/<xs:enumeration>來定義,比如這裏使用到的CachingMode。
   1: <?xml version="1.0" encoding="utf-8"?>
   2: <xs:schema xmlns:xs="https://www.w3.org/2001/XMLSchema" >
   3:   <xs:element name="artech.messages" type="MessagesConfigSection"/>
   4:   <!--MessagesConfigSection-->
   5:   <xs:complexType name="MessagesConfigSection">
   6:     <xs:choice minOccurs="0" maxOccurs="unbounded">
   7:       <xs:element name="providers" minOccurs="1" maxOccurs="1">
   8:         <xs:complexType>
   9:           <xs:sequence>
  10:             <xs:element name="add" type="MessageProvider" minOccurs="1" maxOccurs="unbounded"/>
  11:           </xs:sequence>
  12:         </xs:complexType>
  13:       </xs:element>
  14:     </xs:choice>    
  15:     <xs:attribute name="defaultProvider" type="xs:string" use="required">
  16:       <xs:annotation>
  17:         <xs:documentation>The configuration name of the default MessageProvider.</xs:documentation>
  18:       </xs:annotation>
  19:     </xs:attribute>
  20:     <xs:attribute name="cachingMode" type="CachingMode" use="optional">
  21:       <xs:annotation>
  22:         <xs:documentation>The caching mode (None, Single, Category, All).</xs:documentation>
  23:       </xs:annotation>
  24:     </xs:attribute>    
  25:   </xs:complexType>
  26:   <!--MessageProvider-->
  27:   <xs:complexType name="MessageProvider">
  28:     <xs:attribute name="name" use="required">
  29:       <xs:annotation>
  30:         <xs:documentation>A friendly name of MessageProvider.</xs:documentation>
  31:       </xs:annotation>
  32:     </xs:attribute>
  33:     <xs:attribute name="type" type="MessageProviderTypes" use="required">
  34:       <xs:annotation>
  35:         <xs:documentation>The assembly qualified name of the MessageProvider type.</xs:documentation>
  36:       </xs:annotation>
  37:     </xs:attribute>
  38:     <xs:attribute name="connectionString" type="xs:string" use="optional">
  39:       <xs:annotation>
  40:         <xs:documentation>[DbMessageProvider]The connection string configuration name.</xs:documentation>
  41:       </xs:annotation>
  42:     </xs:attribute>
  43:     <xs:attribute name="applicationName" type="xs:string" use="optional">
  44:       <xs:annotation>
  45:         <xs:documentation>[DbMessageProvider]The name of application.</xs:documentation>
  46:       </xs:annotation>
  47:     </xs:attribute>
  48:     <xs:attribute name="source" type="xs:string" use="optional">
  49:       <xs:annotation>
  50:         <xs:documentation>[XMLMessageProvider] The path of the XML file to store message entry list.</xs:documentation>
  51:       </xs:annotation>
  52:     </xs:attribute>
  53:   </xs:complexType>
  54:   <!--CachingMode-->
  55:   <xs:simpleType name="CachingMode">
  56:     <xs:restriction base="xs:string">
  57:       <xs:enumeration value="None"/>
  58:       <xs:enumeration value="Single"/>
  59:       <xs:enumeration value="Category"/>
  60:       <xs:enumeration value="All"/>
  61:     </xs:restriction>
  62:   </xs:simpleType>
  63:   <!--MessageProviderTypes-->
  64:   <xs:simpleType name="MessageProviderTypes">
  65:     <xs:restriction base="xs:string">
  66:       <xs:enumeration value="Artech.Messages.DbMessageProvider, Artech.Messages"/>
  67:       <xs:enumeration value="Artech.Messages.XmlMessageProvider, Artech.Messages"/>
  68:     </xs:restriction>
  69:   </xs:simpleType>
  70: </xs:schema>

三、應用XSD以獲得職能感知的支持

如果這樣一個XSD已經定義好,在對配置文件進行編輯的時候,通過VS的菜單XML\Schemas打開XML Schemas對話框。點擊Add按鈕將這個XSD文件添加近來,並Use屬性設置成Use this schema。這樣你編譯配置文件的時候就可以獲得隻能感知的支持了,配置將會變得非常的容易,即使對配置結構不太了解的人也能根據智能感知和提示性的描述完成配置工作。

image


作者:蔣金楠
微信公眾賬號:大內老A
微博:www.weibo.com/artech
如果你想及時得到個人撰寫文章以及著作的消息推送,或者想看看個人推薦的技術資料,可以掃描左邊二維碼(或者長按識別二維碼)關注個人公眾號(原來公眾帳號蔣金楠的自媒體將會停用)。
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁麵明顯位置給出原文連接,否則保留追究法律責任的權利。
原文鏈接

最後更新:2017-10-27 11:04:15

  上一篇:go  一個關於反序列化的小問題
  下一篇:go  [WCF安全係列]從兩種安全模式談起