开发者

How to use IConfigurationSectionHandler for global configuration?

开发者 https://www.devze.com 2023-01-15 15:00 出处:网络
I recently started using IConfigurationSectionHandler as a custom configuration sectio开发者_开发问答n for my BL DLL. I\'m using it inside web.config files to pass settings values to the BL DLL.

I recently started using IConfigurationSectionHandler as a custom configuration sectio开发者_开发问答n for my BL DLL. I'm using it inside web.config files to pass settings values to the BL DLL.

While it reads the local web.config perfectly, the problem is reading a global configuration file (root web.config) that consists of shared settings.

How can I manage to do that using IConfigurationSectionHandler?


To properly answer your question we would probably need to see some code from you custom section handler.

However, one point that immediately springs to mind, is that you might not be correctly using the parent argument that is being passed into your handler.

Just to get our terminoligy on the same page, I will refer to the 'Create' method which is your implementation of the IConfigurationSectionHandler.Create, and a configuration object which is the object that you return from the 'Create' method.

Very simplistically, your section handlers Create method should be invoked for each occurance of your custom section in the hierarchy of web.config files. With each invocation, previous configuration object that you returned from Create is passed into the next call as the parent argument, of course the first call will have a null parent which indicates that you need to create this initial 'configuration object', subsequent calls should not create a new configuration object but add to or modify the one passed in as the parent.

The end result is that when you read the configuration from the file you receive a 'configruation object' that contains the sum of the settings from all levels.

NB: You should really be using ConfigurationSection, since IConfigurationSectionHandler has been deprecated since Framework 2.0. Here is a link to using this class.

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


I would prefer inheriting ConfigurationSection over implementing IConfigurationSectionHandler since you do not have to manually deal with the XML.

Have a look at these links. Each explains one of above:

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

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


This is an example of using our own configuration class in web.config. Lets say we have a class which is to be initialized in web.config and used in our code.

Here is our class:

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);
        }

    }
}

}

Now we declare this with a name in web.config.

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

Now in web.config itself, we add this anywhere between configuration tags:

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

Now we can access this section from code like this:

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

Hope this helps someone.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号