2009-10-30 122 views
3

我設計了一個自定義節處理程序之前,但我面臨的問題,我似乎無法想象。我有這樣的配置部分:自定義web.config節處理程序

<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"> 
    <configSections> 
     <section name="providers" requirePermission="false" type="MyProject.Configuration.ProvidersSection"/> 
    </configSections> 

    <providers> 
     <provider name="products"> 
      <queries> 
       <add name="insert" value="InsertProduct" /> 
       <add name="retrieve" value="GetProduct" /> 
       <add name="collect" value="GetProducts" /> 
       <add name="update" value="UpdateProduct" /> 
       <add name="delete" value="DeleteProduct" /> 
      <queries> 
     </provider> 
     <provider name="tasks"> 
      <queries> 
       <add name="insert" value="InsertTask" /> 
       <add name="retrieve" value="GetTaskById" /> 
       <add name="collect" value="GetMultipleTasks" /> 
       <add name="update" value="UpdateTask" /> 
       <add name="delete" value="DeleteTask" /> 
      <queries> 
     </provider> 
     <provider name="events"> 
      <queries> 
       <add name="insert" value="AddEvent" /> 
       <add name="retrieve" value="GetEvent" /> 
       <add name="collect" value="GetEvents" /> 
       <add name="update" value="UpdateEvent" /> 
       <add name="delete" value="DeleteEvent" /> 
      <queries> 
     </provider> 
    </providers> 
</configuration> 

我創建了以下處理類:

using System.Configuration; 

namespace MyProject.Configuration 
{ 
    public class ProvidersSection : ConfigurationSection 
    { 
     public new Element this[string key] 
     { 
      get 
      { 

      } 
     } 
    } 

    [ConfigurationCollection(typeof(ProviderElement))] 
    public class ProvidersCollection : ConfigurationElementCollection 
    { 

     protected override ConfigurationElement CreateNewElement() 
     { 
      return new ProviderElement(); 
     } 

     protected override object GetElementKey(ConfigurationElement element) 
     { 
      return element.ElementInformation.Properties["name"].Value; 
     } 

     public ProviderElement this[string key] 
     { 
      get 
      { 
       return (ProviderElement)base.BaseGet(key); 
      } 
     } 
    } 

    public class ProviderElement : ConfigurationElement 
    { 
     public string this[string name] 
     { 
      get 
      { 
       return string.Empty; 
      } 
     } 
    } 
} 

,我需要這些課程,以便成功地執行以下代碼的代碼是什麼?

string query = ProvidersSection["tasks"].Queries["Insert"]; 

回答

4

你應該考慮使用ConfigurationElementCollectionKeyValueConfigurationCollection你想作爲一個集合使用的元素。在這種情況下,您將必須創建一個元素集合,每個元素都有一個KeyValueConfigurationCollection。因此,而不是你有上面的XML配置,你將有更多的東西是這樣的:

<providers> 
    <provider key="products"> 
     <queries> 
      <add key="whatever" value="stuff" /> 
      ...etc... 
     <queries> 
    <provider> 
</providers> 

可以重新使用「查詢」元素,這將是你的KeyValueConfigurationCollection,每個「供應商」。

快速谷歌搜索產生this article on MSDN,這也可能有所幫助。

編輯 - 代碼示例

你的根節定義將是這樣的:

public class ProviderConfiguration : ConfigurationSection 
{ 
    [ConfigurationProperty("Providers",IsRequired = true)] 
    public ProviderElementCollection Providers 
    { 
     get{ return (ProviderElementCollection)this["Providers"]; } 
     set{ this["Providers"] = value; } 
    } 
} 

然後,你的供應商ElementCollection:

public class ProviderCollection : ConfigurationElementCollection 
{ 
    public ProviderElement this[object elementKey] 
    { 
     get { return BaseGet(elementKey); } 
    } 

    public void Add(ProviderElement provider) 
    { 
     base.BaseAdd(provider); 
    } 

    public override ConfigurationElementCollectionType CollectionType 
    { 
     get { return ConfigurationElementCollectionType.BasicMap; } 
    } 

    protected override ConfigurationElement CreateNewElement() 
    { 
     return new ProviderElement(); 
    } 

    protected override object GetElementKey(ConfigurationElement element) 
    { 
     return ((ProviderElement)element).Key; 
    } 

    protected override string ElementName 
    { 
     get { return "Provider"; } 
    } 
} 

然後,你的供應商元素:

public class Provider : ConfigurationElement 
{ 
    [ConfigurationProperty("Key",IsRequired = true, IsKey = true)] 
    public string Key 
    { 
     get { return (string) this["Key"]; } 
     set { this["Key"] = value; } 
    } 

    [ConfigurationProperty("Queries", IsRequired = true)] 
    public KeyValueConfigurationCollection Queries 
    { 
     get { return (KeyValueConfigurationCollection)this["Queries"]; } 
     set { this["Queries"] = value; } 
    } 
} 

你可能不得不亂搞KeyValueConfigurationCollection一點,以使其正常工作,但我認爲這將是一般想法。然後,當你在你的代碼中訪問這個東西時,你會這樣做:

var myConfig = (ProviderConfiguration)ConfigurationManager.GetSection("Providers"); 
//and to access a single value from, say, your products collection... 
var myValue = myConfig.Providers["Products"].Queries["KeyForKeyValuePairing"].Value; 

希望有所幫助。現在只是不要問我把它翻譯成VB :-D

+0

謝謝你的及時迴應。我非常感謝你的有效方法。我設法弄清楚如何處理單個提供者中的集合。但是,如何使我的「ProvidersSection」類成爲SectionHandler以及ConfigurationElementCollection? – 2009-10-30 19:27:06

+0

我想問一個問題的另一種方法是,「我如何創建一個ConfigurationElementCollection對象的集合映射到SectionHandler中的每個提供者? – 2009-10-30 19:42:52

+0

用代碼編輯我的答案 – 2009-10-30 20:21:22