我有一个包含多个输出项目的解决方案(网站,管理工具和SOAP API层)。
它们各自共享解决方案中的常见项目(服务层,数据层等)。在其中一个常见项目中,我希望存储一个配置层。
目前,我们为每个输出项目提供了三个单独的appsettings配置文件 -
development.AppSettings.config
testing.AppSettings.config
production.AppSettings.config
总而言之,有九个配置文件。每个项目中只使用一个,因为它们是通过使用web.config appsettings节点中的configSource属性引用的。
Anyhoo,在我们想要添加/删除配置文件中的值时,它会变得很痛苦,因为这意味着我们必须更改所有 9个文件才能执行此操作。这就是我想做的事情:
在常见项目中,我们有三个配置文件,如上所述。这些将被设置为复制到输出目录,以便每个项目都有它们的副本。这些将是'基础'配置。
然后在每个项目中,我想再次拥有三个文件,但它们不一定必须包含与基本配置相同的值。 但是如果他们这样做了,那么基本配置值将被输出项目配置中的值覆盖。我想是一种配置继承形式。
在应用程序启动时,我希望能够获得这两个配置文件 - 基本配置和项目配置文件。然后相应地设置应用程序设置。
我想知道的是,确定使用哪个文件的好方法是什么?另外,我想知道这是一种在大型解决方案中共享应用程序值的好方法,还有另一种可能更有效的方法吗?
如果我处于开发模式,那么我不想生产.appsettings.config,反之亦然,如果我处于生产模式。
在我离开并获得配置之前,是否有一种简单的方法可以获得我所处的模式(开发/测试/生产)?
答案 0 :(得分:1)
答案 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!