跨解决方案共享应用程序配置

时间:2010-02-16 21:48:48

标签: c# asp.net asp.net-mvc configuration-files config

我有一个包含多个输出项目的解决方案(网站,管理工具和SOAP API层)。

它们各自共享解决方案中的常见项目(服务层,数据层等)。在其中一个常见项目中,我希望存储一个配置层。

目前,我们为每个输出项目提供了三个单独的appsettings配置文件 -

  • development.AppSettings.config
  • testing.AppSettings.config
  • production.AppSettings.config

总而言之,有九个配置文件。每个项目中只使用一个,因为它们是通过使用web.config appsettings节点中的configSource属性引用的。

Anyhoo,在我们想要添加/删除配置文件中的值时,它会变得很痛苦,因为这意味着我们必须更改所有 9个文件才能执行此操作。这就是我想做的事情:

在常见项目中,我们有三个配置文件,如上所述。这些将被设置为复制到输出目录,以便每个项目都有它们的副本。这些将是'基础'配置。

然后在每个项目中,我想再次拥​​有三个文件,但它们不一定必须包含与基本配置相同的值。 但是如果他们这样做了,那么基本配置值将被输出项目配置中的值覆盖。我想是一种配置继承形式。

在应用程序启动时,我希望能够获得这两个配置文件 - 基本配置和项目配置文件。然后相应地设置应用程序设置。

我想知道的是,确定使用哪个文件的好方法是什么?另外,我想知道这是一种在大型解决方案中共享应用程序值的好方法,还有另一种可能更有效的方法吗?

如果我处于开发模式,那么我不想生产.appsettings.config,反之亦然,如果我处于生产模式。

在我离开并获得配置之前,是否有一种简单的方法可以获得我所处的模式(开发/测试/生产)?

3 个答案:

答案 0 :(得分:1)

您可以拥有一组文件(3个配置),并在您需要的任何项目中链接/共享它们。

http://www.devx.com/vb2themax/Tip/18855

希望这有帮助。

答案 1 :(得分:1)

您可以使用ConfigurationManager.OpenExeConfiguration静态方法。这将允许您使用任意数量的配置文件。

您也可以尝试创建自定义类来存储所有设置。然后,您可以序列化您的对象以将其另存为文件。您可以扩展基本自定义配置类以适合所有其他项目。

答案 2 :(得分:1)

经过一番细心的思考,并在03:30上厕所,我遇到了一个有效的解决方案。

假设我们的基本配置文件中有一些appSettings:

<add key="MyKey1" value="MyValue1" />
<add key="MyKey2" value="MyValue2" />
<!-- And so on... -->
<add key="MyKey5" value="MyValue5" />

在我的输出项目中,我有三个appSettings:

<!-- This is used to identify which config to use. -->
<add key="Config" value="Development" />

<!-- Different value to the one in the base -->
<add key="MyKey2" value="NewValue2" />

<!-- This key does not exist in the base config -->
<add key="MyKey6" value="MyValue6" />

在我的Application_Start中,我打电话给GetConfigs()

ConfigHelper.GetConfig(HostingEnvironment.MapPath( “〜/ bin中/ BaseConfig”));

实际的GetConfigs功能:

public static void GetConfigs()
{
  if (configMode == null)
  {
    configMode = ConfigurationManager.AppSettings.Get("Config").ToLowerInvariant();
  }

  //Now load the app settings file and retrieve all the config values.
  var config = XElement.Load(@"{0}\AppSettings.{1}.config".FormatWith(directory, configMode))
    .Elements("add")
    .Select(x => new { Key = x.Attribute("key").Value, Value = x.Attribute("value").Value })
    //If the current application instance does not contain this key in the config, then add it.
    //This way, we create a form of configuration inheritance.
    .Where(x => ConfigurationManager.AppSettings.Get(x.Key) == null);

  foreach (var configSetting in config)
  {
      ConfigurationManager.AppSettings.Set(configSetting.Key, configSetting.Value);
  }
}

现在,我的输出项目有效地具有以下配置设置:

<add key="Config" value="Development" />
<add key="MyKey1" value="MyValue1" />
<add key="MyKey2" value="NewValue2" />
<!-- And so on... -->
<add key="MyKey5" value="MyValue5" />
<add key="MyKey6" value="MyValue6" />

Simples!