有没有办法确保类库使用它自己的应用程序设置?

时间:2011-05-19 01:56:14

标签: c# .net configuration c#-4.0

我目前有一个类库,它需要自己的appsettings,它可能需要更改它们和东西。

唯一的问题是该类将由一个Web应用程序调用,该应用程序的appsettings文件也具有与类库应用程序设置相同的键。

我想确保类库使用它自己的appsettings文件,并且它不会对Web应用程序的appsettings进行更改。

这可能吗?似乎任何程序集都可以通过ConfigurationManager更改appsettings。

编辑 - 为了给出上下文,类库访问数据层程序集(我无法更改),它使用appSettings中的值来获取连接字符串。唯一的问题是该密钥与Web应用程序的连接字符串相同(可能有也可能没有不同的值)。

我不希望类库更改该键的appSetting值,然后让Web应用程序开始访问其他数据库。

5 个答案:

答案 0 :(得分:1)

我相信单独的应用程序域可以使用不同的配置文件。我不知道你还能怎么做。

答案 1 :(得分:1)

没有方法可以做到这一点。它根本不是.NET的工作方式。

考虑到类库可以在两个单独的应用程序中使用。每个应用程序可能需要对同一类库进行不同的设置。唯一可行的方法是,如果使用类库中的配置文件。

答案 2 :(得分:1)

不要使用app / web.config文件,而应考虑构建自己的继承自System.Configuration.SettingsBase的设置类。

然后,您的类库可以实例化此SettingsBase实现的副本并管理自己的设置,而不会干扰其他地方可能需要的设置。

http://msdn.microsoft.com/en-us/library/system.configuration.settingsbase.aspx

设置类看起来像这样:

sealed class MySettings : SettingsBase
{
    [ApplicationScopedSetting()]
    [DefaultSettingValue("Default")]
    public string MySetting
    {
        get { return this["MySetting"].ToString(); }
        set { this["MySetting"] = value; }
    }
}

答案 3 :(得分:1)

您可以使用ConfigurationManager.OpenMappedExeConfiguration从类库中获取特定文件的配置。

 // Map the new configuration file.
 var configFileMap = new ExeConfigurationFileMap();
 configFileMap.ExeConfigFilename = configFile;

 // Get the mapped configuration file
 Configuration config = ConfigurationManager.OpenMappedExeConfiguration(
    configFileMap, ConfigurationUserLevel.None);

此处配置将允许您访问AppSettings,ConnectionStrings和Sections。您可以在访问ConfigurationManager之上创建一个抽象,这样您就可以控制它的访问权限,从而使其更易于测试,但这取决于设计。

正如您在其中一个答案中提到的自动生成代码,有时可以解决这个问题。很可能该类被标记为partial,您可以使用正确的“Configuration”对象进行初始化,以及正确的连接字符串

答案 4 :(得分:1)

将配置文件命名为如下所示,并将其放在与程序集相同的文件夹中: [的AssemblyName] .dll.config

更新:可以使用任何内容。您还可以使用AppSettingsReader(http://msdn.microsoft.com/en-us/library/system.configuration.appsettingsreader.aspx)创建自定义设置。

例如:

<configuration>
  <appSettings>
    <add key="YourCustomSetting" value="10240" />
  </appSettings>

  <system.diagnostics>
    ...
  </system.diagnostics>

  <connectionStrings>...
  <system.web>...
  etc, etc.
</configuration>