為自定義配置的編輯提供“智能感知”的支持
當(dāng)我們在設(shè)計一個框架的時候,必然會涉及一系列的配置。為了讓使用者更好地使用你提供的框架,讓他們能夠容易地維護(hù)這些配置是一項基本的要求。對于一些配置過于復(fù)雜的框架,比如EnterLib,比如WCF,往往會提供一個配置的工具。但是,不過這樣的配置工具是否提供,手工編譯配置文件是在所難免的。如果在通過VS編輯配置的時候,能夠提供智能感知和提示性描述的支持,這無疑會使配置的編輯變得非常的容易。這里是一個簡單的例子。
一、配置文件的結(jié)構(gòu)
假設(shè)我們設(shè)計一個MessageGenerator的組件,用于生成程序我們需要的文本消息,比如驗證控件的驗證消息,異常的消息等。消息的內(nèi)容根據(jù)需要可以保存在數(shù)據(jù)庫中或者是XML文件中,并且采用不同模式(粒度)的緩存(None、Single、Category和All)。我們采用插件式的設(shè)計,定義一個IMessageProvider接口用于從數(shù)據(jù)源中獲取消息列表,兩個具體的DbMessageProvider和XmlMessageProvider實現(xiàn)了這個接口。具體采用那個MessageProvider,通過配置來決定(defaultProvider),配置結(jié)構(gòu)如下所示:
- <?xml version="1.0"?>
- <configuration>
- <configSections>
- <section name="artech.messages"type="Artech.Messages.MessagesSetting, Artech.Messages"/>
- </configSections>
- <artech.messages defaultProvider="DbProvider"cachingMode="None">
- <providers>
- <add name="DbProvider"type="Artech.Messages.DbMessageProvider, Artech.Messages"
- connectionString="" applicationName="" />
- <add name="XmlProvider"type="Artech.Messages.XmlMessageProvider, Artech.Messages" source="~/Messages.xml"/>
- </providers>
- </artech.messages>
- </configuration>
二、為配置定義XSD
為了在VS中編輯配置文件的時候獲得智能感知的支持,我們需要為它定義XSD。整個XSD如下所示,結(jié)構(gòu)比較清晰。不過在這里有幾點需要強(qiáng)調(diào):
(1)我們通過采用<xs:documentation>節(jié)點定義一些表述性的文字。當(dāng)你通過VS編輯配置文件的時候,針對當(dāng)前配置節(jié)點定義的這些文字將會以Tips的形式顯示出來;
(2)在定義MessageProvider的schema的時候,我們將針對所有預(yù)定義MessageProvider的配置屬性都定義出來(DbMessageProvider的applicationName和connectionStringName,以及XmlMessageProvider的source)。如果這些配置屬性不是對于所有的MessageProvider都是必須的(比如name和type),將它們定義成可選屬性;
(3)對于一些枚舉,或者限定在某個列表范圍內(nèi)固定的值,通過<xs:restriction>/<xs:enumeration>來定義,比如這里使用到的CachingMode。
- <?xml version="1.0" encoding="utf-8"?>
- <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" >
- <xs:element name="artech.messages"type="MessagesConfigSection"/>
- <!--MessagesConfigSection-->
- <xs:complexType name="MessagesConfigSection">
- <xs:choice minOccurs="0" maxOccurs="unbounded">
- <xs:element name="providers" minOccurs="1"maxOccurs="1"> <xs:complexType>
- <xs:sequence>
- <xs:element name="add" type="MessageProvider"minOccurs="1" maxOccurs="unbounded"/>
- </xs:sequence>
- </xs:complexType>
- </xs:element>
- </xs:choice>
- <xs:attribute name="defaultProvider" type="xs:string"use="required">
- <xs:annotation>
- <xs:documentation>The configuration name of the default essageProvider.</xs:documentation>
- </xs:annotation>
- </xs:attribute>
- <xs:attribute name="cachingMode" type="CachingMode" use="optional">
- <xs:annotation>
- <xs:documentation>The caching mode (None, Single, Category, All).</xs:documentation>
- </xs:annotation>
- </xs:attribute>
- </xs:complexType>
- <!--MessageProvider-->
- <xs:complexType name="MessageProvider">
- <xs:attribute name="name" use="required">
- <xs:annotation>
- <xs:documentation>A friendly name of MessageProvider.</xs:documentation>
- </xs:annotation>
- </xs:attribute>
- <xs:attribute name="type" type="MessageProviderTypes" use="required">
- <xs:annotation>
- <xs:documentation>The assembly qualified name of the MessageProvider type.</xs:documentation>
- </xs:annotation>
- </xs:attribute>
- <xs:attribute name="connectionString" type="xs:string" use="optional">
- <xs:annotation>
- <xs:documentation>[DbMessageProvider]The connection string configuration name.</xs:documentation>
- </xs:annotation>
- </xs:attribute>
- <xs:attribute name="applicationName" type="xs:string" use="optional">
- <xs:annotation>
- <xs:documentation>[DbMessageProvider]The name of application.</xs:documentation>
- </xs:annotation>
- </xs:attribute>
- <xs:attribute name="source" type="xs:string" use="optional">
- <xs:annotation>
- <xs:documentation>[XMLMessageProvider] The path of the XML file to store message entry list.</xs:documentation>
- </xs:annotation>
- </xs:attribute>
- </xs:complexType>
- <!--CachingMode-->
- <xs:simpleType name="CachingMode">
- <xs:restriction base="xs:string">
- <xs:enumeration value="None"/>
- <xs:enumeration value="Single"/>
- <xs:enumeration value="Category"/>
- <xs:enumeration value="All"/>
- </xs:restriction>
- </xs:simpleType>
- <!--MessageProviderTypes-->
- <xs:simpleType name="MessageProviderTypes">
- <xs:restriction base="xs:string">
- <xs:enumeration value="Artech.Messages.DbMessageProvider, Artech.Messages"/>
- <xs:enumeration value="Artech.Messages.XmlMessageProvider, Artech.Messages"/>
- </xs:restriction>
- </xs:simpleType>
- </xs:schema>
三、應(yīng)用XSD以獲得職能感知的支持
如果這樣一個XSD已經(jīng)定義好,在對配置文件進(jìn)行編輯的時候,通過VS的菜單XML\Schemas打開XML Schemas對話框。點擊Add按鈕將這個XSD文件添加近來,并Use屬性設(shè)置成Use this schema。這樣你編譯配置文件的時候就可以獲得只能感知的支持了,配置將會變得非常的容易,即使對配置結(jié)構(gòu)不太了解的人也能根據(jù)智能感知和提示性的描述完成配置工作。
【編輯推薦】