技术开发 频道

揭开.NET 2.0配置隐藏的秘密

  每个配置节可以由任意数量的属性(attributes)和元素(elements)组成,元素可以嵌套的任意的深度以满足应用程序。相对于其他XML用法,这总是一个好主意,符合相同的XML自定义配置节的非常好的做法。作为一般规则,数据集或大量的信息不应该保存在自定义配置节。我们将在高级配置主题那节讨论原因。这些“配置”部分,应该用于存储结构化的应用配置信息。

  6、添加元素集合

  在上一节,我们在一个配置节元素中创建一个嵌套元素。嵌套的元素仅限于只有一个实例,且必须出现在指定的元素中。创建元素集合或元素列表需要不同的和稍微复杂的方法。在配置文件中要创建一个配置元素集合或列表,你必须要创建一个类继承自ConfigurationElementCollection。几种集合可以被创建,两个主要集合类型是BasicMap和AddRemoveClearMap。

  任何用过配置节的人都会熟悉AddRemoveClearMap的集合类型。AddRemoveClearMap是ASP.NET web.config文件中的一个级联集合。级联集合允许元素在web站点路径级添加,移除或清除在低级别的应用程序级。此外,在低级别添加的任何新的唯一元素都将和高级别的所有元素合并。请参阅附录A,更多细节关于配置如何级联作用。Basic map更为严格,但允许其他不是“add”名称的元素添加到一个集合中。一个Basic map的别的元素名称的例子是System.Web的节,它支持一个元素的集合。

  由于AddRemoveClearMap集合是默认类型,让我们创建一个并将它加到我们之前的配置节例子中。创建一个元素集合的代码比配置节或单个元素要稍微复杂一些,但是整体来说仍然非常简单。下面的元素集合代码遵循一个标准模式,.NET 2.0框架中大部分元素集合都是它:

[ConfigurationCollection(typeof(ThingElement),
    CollectionType
=ConfigurationElementCollectionType.AddRemoveClearMap)]
public class ExampleThingElementCollection: ConfigurationElementCollection
{
    
#region Constructors
    
static ExampleThingElementCollection()
    {
        m_properties
= new ConfigurationPropertyCollection();
    }

    
public ExampleThingElementCollection()
    {
    }
    #endregion

    
#region Fields
    
private static ConfigurationPropertyCollection m_properties;
    #endregion

    
#region Properties
    
protected override ConfigurationPropertyCollection Properties
    {
        
get { return m_properties; }
    }
    
    
public override ConfigurationElementCollectionType CollectionType
    {
        
get { return ConfigurationElementCollectionType.AddRemoveClearMap; }
    }
    #endregion

    
#region Indexers
    
public ThingElement this[int index]
    {
        
get { return (ThingElement)base.BaseGet(index); }
        
set
        {
            
if (base.BaseGet(index) != null)
            {
                base.BaseRemoveAt(index);
            }
            base.BaseAdd(index, value);
        }
    }

    
public ThingElement this[string name]
    {
        
get { return (ThingElement)base.BaseGet(name); }
    }
    #endregion
    
    
#region Overrides
    
protected override ConfigurationElement CreateNewElement()
    {
        
return new ThingElement();
    }

    
protected override object GetElementKey(ConfigurationElement element)
    {
        
return (element as ThingElement).Name;
    }
    #endregion
}
0
相关文章