【问题标题】:How to use IConfigurationSectionHandler for global configuration?如何使用 IConfigurationSectionHandler 进行全局配置?
【发布时间】:2010-09-12 08:46:41
【问题描述】:

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

虽然它可以完美读取本地 web.config,但问题在于读取包含共享设置的全局配置文件(根 web.config)。

如何使用 IConfigurationSectionHandler 做到这一点?

【问题讨论】:

    标签: c# asp.net web-config


    【解决方案1】:

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

    但是,立即想到的一点是,您可能没有正确使用传递给处理程序的 parent 参数。

    为了在同一页面上获得我们的术语,我将参考“创建”方法,它是您对 IConfigurationSectionHandler.Create 的实现,以及一个 configuration object,它是您从“创建”方法返回的对象.

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

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

    注意:你真的应该使用ConfigurationSection,因为 IConfigurationSectionHandler 自 Framework 2.0 起已被弃用。这是使用此类的链接。

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案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;
        

        希望这对某人有所帮助。

        【讨论】:

          猜你喜欢
          • 2022-01-11
          • 2019-06-14
          • 1970-01-01
          • 2016-07-01
          • 2014-10-27
          • 1970-01-01
          • 1970-01-01
          • 2017-10-26
          相关资源
          最近更新 更多