我最近开始使用IConfigurationSectionHandler作为我的BL DLL的自定义配置部分。我在web.config文件中使用它将设置值传递给BL DLL。
虽然它完全读取本地web.config,但问题是正在读取由共享设置组成的全局配置文件(root web.config)。
如何使用IConfigurationSectionHandler设法做到这一点?
答案 0 :(得分:4)
要正确回答您的问题,我们可能需要查看自定义部分处理程序中的一些代码。
但是,有一点我想起来,可能是你没有正确使用传递给你的处理程序的parent
参数。
为了让我们的终端在同一页面上,我将引用'Create'方法,它是IConfigurationSectionHandler.Create
的实现,以及configuration object
,它是您从'创建'方法。
非常简单,应该为web.config文件层次结构中每个自定义部分的出现调用节处理程序Create
方法。每次调用时,从Create
返回的先前配置对象将作为parent
参数传递给下一个调用,当然第一个调用将具有null
父级,表示您需要要创建此初始“配置对象”,后续调用不应创建新的configuration objec
t,而是添加或修改作为父项传入的那个。
最终结果是,当您从文件中读取配置时,您会收到一个'configruation对象',其中包含所有级别的设置总和。
NB:您应该使用ConfigurationSection,因为自Framework 2.0以来已弃用IConfigurationSectionHandler。这是使用此类的链接。
答案 1 :(得分:4)
我更愿意继承ConfigurationSection而不是实现IConfigurationSectionHandler,因为您不必手动处理XML。
看看这些链接。每个都解释了以上之一:
答案 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;
希望这有助于某人。