2012-08-10 70 views
2

我創建了一個自定義配置部分來存儲項目列表。在配置如下:從自定義Web配置部分讀取單個項目

<configSections> 
    <section name="Items" type="namespace.Items, namespace"/> 
</configSections> 
<Items> 
    <Item name="Item1"/> 
    <Item name="Item2"/> 
</Items> 

我也創建了自己的配置處理程序如下:

public class ItemConfigurationHandler : IConfigurationSectionHandler 
{ 
    public ItemConfigurationHandler() 
    { 
    } 

    public object Create(object parent, object configContext, System.Xml.XmlNode section) 
    { 
     List<Item> items = new List<Item>(); 
     System.Xml.XmlNodeList items = section.SelectNodes("Item"); 

     foreach (XmlNode i in items) 
     { 
      Item item = new Item(); 
      item.Name = i.Attributes["name"].InnerText; 
      items.Add(item); 
     } 

     return items; 
    } 
} 

這是目前工作正常,我可以從配置檢索項目的列表如下:

List<Item> ts = (List<Item>)ConfigurationManager.GetSection("Items"); 

我想知道,但是,是否有可能檢索一個單一的項目?例如,如果我只想要「Item1」的詳細信息。我可以成功地檢索列表,然後過濾名稱=「Item1」,但這意味着加載所有XML似乎有點多,如果只想從列表中的一個項目,特別是當這個列表增長,我不想加載20個項目如果我只需要一個,或者這不是什麼問題?

回答

2

我會說這不是一個大問題 - 加載1對20你不會看到今天的機器上的blip,除非你有嵌套的XML配置。

ConfigurationManager也緩存值,所以一旦你查詢配置部分,他們留在內存中的後續請求。您可以使用ConfigurationManager.RefreshSection("Items")刷新緩存。

+0

謝謝SliverNinja,我可能會堅持過濾項目列表。當ConfigurationManager緩存這些值時,您認爲這比將值存儲在單獨的文件中並編寫自己的方法來解析XML更快嗎? (我想這取決於我如何解析它?) – cast01 2012-08-10 14:13:28

+0

這取決於您的配置有多複雜,需要多少靈活性以及是否執行自己的緩存。作爲代碼的未來維護者 - 我寧願你不要重新發明輪子(*支持.NET配置支持*)。我們有標準有一個原因,但總是有理由彎曲邊緣案例的規則。 – SliverNinja 2012-08-10 14:16:42

+0

@SliverNinja這是一個邊緣情況? – Sam 2012-08-10 14:19:09

2

是否有理由需要將這些物品存儲在web.config?概念上,web.config文件用於配置設置。如果您計劃以編程方式讀取/寫入此文件,您是否可以將數據存儲在自己的自定義 xml文件中,並從那裏解析數據?

編輯:由於您的評論顯示您希望將這些項目保留在web.config中,我不相信這將是檢索整個列表並重複查找所需值的主要問題。您可以將值添加到<appSettings>標籤並單獨訪問它們。

如:

<appSettings> 
    <add key="item1" value="item1 value"/> 
    <add key="item2" value="item2 value"/> 
    . . . 
    <add key="item20" value="item20 value"/> 
</appSettings> 

訪問它像這樣:

var item1Value = ConfigurationManager.AppSettings["item1"]; 

不過,如果你只是讀這信息,我不清楚爲什麼你在把他們設置配置文件開始。只是在代碼中定義這些變量可能更容易。

+0

嗨,山姆,我認爲這種方法,但我不需要寫入文件,所以想我把所有的東西都放在配置中。如果沒有辦法讀出一個單一的值,那麼我會採取這種方法。謝謝! – cast01 2012-08-10 14:10:20

+0

嗨,山姆,感謝您的編輯。我將來很可能會在未來擴展這些具有更多屬性的項目,所以一個簡單的「key => value」方法將不夠用,因此需要定製部分。我選擇這種方法的原因是我正在創建一個我想插入Web應用程序的類庫,我不想硬編碼這些項目,並且每次我想更新一個值時都會重新編譯(這很少見)。再次感謝! – cast01 2012-08-10 14:24:25

+0

沒問題,祝您的項目好運! – Sam 2012-08-10 14:25:39

相關問題