如何使用IConfigurationSectionHandler进行全局配置?

时间:2010-09-12 08:46:42

标签: c# asp.net web-config

我最近开始使用IConfigurationSectionHandler作为我的BL DLL的自定义配置部分。我在web.config文件中使用它将设置值传递给BL DLL。

虽然它完全读取本地web.config,但问题是正在读取由共享设置组成的全局配置文件(root web.config)。

如何使用IConfigurationSectionHandler设法做到这一点?

3 个答案:

答案 0 :(得分:4)

要正确回答您的问题,我们可能需要查看自定义部分处理程序中的一些代码。

但是,有一点我想起来,可能是你没有正确使用传递给你的处理程序的parent参数。

为了让我们的终端在同一页面上,我将引用'Create'方法,它是IConfigurationSectionHandler.Create的实现,以及configuration object,它是您从'创建'方法。

非常简单,应该为web.config文件层次结构中每个自定义部分的出现调用节处理程序Create方法。每次调用时,从Create返回的先前配置对象将作为parent参数传递给下一个调用,当然第一个调用将具有null父级,表示您需要要创建此初始“配置对象”,后续调用不应创建新的configuration objec t,而是添加或修改作为父项传入的那个。

最终结果是,当您从文件中读取配置时,您会收到一个'configruation对象',其中包含所有级别的设置总和。

NB:您应该使用ConfigurationSection,因为自Framework 2.0以来已弃用IConfigurationSectionHandler。这是使用此类的链接。

http://msdn.microsoft.com/en-us/library/2tw134k3.aspx

答案 1 :(得分:4)

我更愿意继承ConfigurationSection而不是实现IConfigurationSectionHandler,因为您不必手动处理XML。

看看这些链接。每个都解释了以上之一:

http://support.microsoft.com/kb/309045

http://msdn.microsoft.com/en-us/library/2tw134k3.aspx

答案 2 :(得分:3)

这是在web.config中使用我们自己的配置类的示例。 假设我们有一个类,它将在web.config中初始化并在我们的代码中使用。

这是我们的课程:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Xml;

namespace MyProject.MyConfigSection
{
    public class MyConfig:System.Configuration.IConfigurationSectionHandler
    {
        public int MyNum1 { get; set; }
        public int MyNum2 { get; set; }
        public int MyNum3 { get; set; }

    public MyConfig()
    {
        MyNum1 = 0;
        MyNum2 = 0;
        MyNum3 = 0;
    }

//implement interface member
    public object Create(object parent, object configContext, System.Xml.XmlNode section)
    {
        try
        {
            MyConfig options = new MyConfig();
            if (section == null) return options;

            foreach (XmlNode node in section.ChildNodes)
            {
                if (node.Name == "MyNum1")
                    options.MyNum1 = int.Parse(node.InnerText);
                else if (node.Name == "MyNum2")
                    options.MyNum2 = int.Parse(node.InnerText);
                else if (node.Name == "MyNum3")
                    options.MyNum3 = int.Parse(node.InnerText);
            }
            return options;
        }
        catch (Exception ex)
        {
            throw new System.Configuration.ConfigurationException(
             "Error loading startup default options", ex, section);
        }

    }
}

}

现在我们在web.config中使用名称声明它。

<configuration>
    <configSections>
        <section name="MYTESTCONFIGSECTION" type="MyProject.MyConfigSection.MyConfig" />
.... //other sections
.... //other sections
    </configSections>

现在在web.config本身,我们在配置标记之间的任何地方添加:

<MYTESTCONFIGSECTION>
    <MyNum1>111</MyNum1>
    <MyNum2>222</MyNum2>
    <MyNum3>333</MyNum3>
</MYTESTCONFIGSECTION>
</configuration>

现在我们可以通过以下代码访问此部分:

var myconfig = System.Web.Configuration.WebConfigurationManager.GetSection("MYTESTCONFIGSECTION") as MyConfigSection.MyConfig;
    myconfig.MyNum1;
    myconfig.MyNum2;
    myconfig.MyNum3;

希望这有助于某人。