从自定义Web配置部分读取单个项目

问题描述:

我创建了一个自定义配置部分来存储项目列表。在配置如下:从自定义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个项目如果我只需要一个,或者这不是什么问题?

我会说这不是一个大问题 - 加载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

是否有理由需要将这些物品存储在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