虽然这个问题在名称上类似于this和this,但事实并非如此。
我目前正在开发一个可能需要一些自定义配置的库,具体取决于用户的需求。
我已经创建了一个自定义配置部分,一切正常。
但是,当我调试时,我注意到配置节构造函数被调用了两次。这不是我想要的。
深入挖掘,我发现它发生的原因是,为了从库中访问配置信息,我使用以下方法:
var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var section = config.GetSection("myConfigSection");
在此之前,.NET Framework已初始化运行库的应用程序的配置环境,从而调用MyConfigSection
类的构造函数。
我的问题是,如何访问已经加载的信息?
为什么要对类的构造函数进行两次调用
因为我不想再次重新加载所有内容,如上面的代码那样。
已编辑添加
即使将上面的代码更改为:
,也会调用构造函数两次var section = ConfigurationManager.GetSection("myConfigSection");
编辑为Clarify
这个问题不是关于访问MyConfigSection
,我访问它就好了。
问题是为什么类'构造函数被调用两次。
稍微澄清一下
如果正在调用类的构造函数两次,则加载过程将发生两次。
而我根本不希望这种情况发生。这太荒谬了。
是的,根据我在这个问题上的第一次编辑,我正在调用Configurationmanager
的静态方法。
答案 0 :(得分:0)
如果父应用程序已经加载了配置,您应该可以在块中使用静态 GetSection:
ConfigurationManager.GetSection('myConfigSection');
如果这不是你想要的,也许你可以更好地解释你的情况。您可能也对AppSettings感兴趣 - http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.appsettings.aspx
答案 1 :(得分:0)
你问了两个问题:为什么要调用ctor两次,以及如何访问已经加载的配置。
你已经指出了它被调用两次的原因。配置系统在加载应用程序时解析配置文件。它通过ConfigurationManager
的静态成员提供该配置,包括ConfigurationManager.AppSetting
和ConfigurationManager.GetSection()
。
您可以使用这些静态成员访问已加载的配置。
答案 2 :(得分:0)
经过进一步调查后,由于以下情况,构造函数被调用两次:
<section name="..." type="..." />
元素中找到<configSections>
时创建该类。app.config
或web.config
中配置了一个部分,则创建指定类的另一个实例以对该部分进行解码并与已创建的实例合并。虽然它根据文档确实有效,但如果开发人员认为在应用程序的生命周期内只创建了一个对象,则此行为可能会与ConfigurationSection
的实现发生冲突。
因此,按照这一思路,如果在machine.config
,app.config
和user.config
中指定了配置,则对象将被构造三次以便合并所有内容在一起。