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 objec
t 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.
精彩评论