.NET Core中的共享设置?

时间:2019-05-27 08:01:32

标签: c# asp.net-core .net-core

我的asp.net核心应用程序中有3个名为appsettings.[int/stg/prod].json的文件:

{
    "EmailForFailedNonCrucial":
    {
        "Email": "royin...",
        "Subject": "...",
        "Body": "...",
        "ConnectionString": "Staging-Connection-String"
    },
    "Servers": [
    {
        "Name": "aaa",
        "Services": [
            ...
        ]
    },
    {
        "Name": "bbb",
        "Services": [
            ...
        ]
    }]
}

每个部分在C#类中都有一个对应的部分。 (用于IOptions)。

对于每个环境,我都有该文件的3个版本:

enter image description here

我可以通过以下方式使用它:

 public static IConfigurationRoot ConfigureConfiguration()
        {
            return new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile($"appsettings.json", optional: true, reloadOnChange: true)
                .AddJsonFile($@"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true)
                .AddEnvironmentVariables()
                .Build();

        }

但是在各个环境中应该唯一的 事物是ConnectionString
Servers部分对于所有环境都是相同的

问题:

在所有3个文件中复制Servers似乎很奇怪。
如何完成一次(继承?)指定,并且每个环境只有EmailForFailedNonCrucial

2 个答案:

答案 0 :(得分:2)

只需将servers部分放在根目录appsettings.json中,将其从其他目录中删除,则默认情况下,应将servers配置添加到所有其他目录中。

更多阅读内容:Configuration in Core

答案 1 :(得分:0)

.NET Core中的配置设置被视为键/值字典中的值。来自多个提供程序的值全部合并在一起,新值替换了旧值。文件名没有特殊意义,仅调用顺序很重要。

这在Essential .NET - Configuration in .NET CoreConfiguration in ASP.NET Core中有解释。尽管有名称,配置库也可用于Full Framework应用程序。

加载时,设置将转换为键/值对。该文件的内容:

{
  "section0": {
    "key0": "value",
    "key1": "value"
  },
  "section1": {
    "key0": "value",
    "key1": "value"
  }
}

被平整为4对,其密钥为:

- section0:key0
- section0:key1
- section1:key0
- section1:key1

如果另一个文件或提供程序产生相同的密钥,则它可以覆盖先前的设置。 SomeotherFile.json可以通过仅为此键指定一个新值来替换section1:key0

{
  "section1": {
    "key0": "value",
  }
}

无需重复设置。

您可以通过将所有通用设置放入一个文件,并从另一文件或提供程序读取特定于环境的设置,从而为每个环境指定不同的设置。

var envSpecificFile=...
return new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile($"appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile(envSpecificFile, optional: true)
            .AddEnvironmentVariables()
            .Build();

使用appsettings.prod.json只是一个约定。读取特定的环境变量来确定环境也只是一个约定。

ASP.NET Core项目的通用约定是使用ASPNETCORE_ENVIRONMENT环境变量:

var env=Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
var envSpecificFile = $"appsettings.{env}.json";

环境也很容易来自命令行参数。这样可以在质量检查服务器上测试不同的配置,例如:

string env;
if(args.Length>0)
{
    env=args[0];
}
else
{
    env=Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
}

这些设置不需要来自JSON文件,它们可以轻松地来自字典,数据库或集中式配置服务。

例如:

  var dictSettings = new Dictionary<string, string>()
  {
      ["section0:key1"] = args[1],
  };

可用于覆盖section0:key1值:

return new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env}.json", optional: true)
            .AddInMemoryCollection(dictSettings)
            .AddEnvironmentVariables()
            .Build();

该示例有些人为。字典通常用于提供默认值,因此通常在其他提供者之前添加字典。

.AddInMemoryCollection(defaultSettings)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env}.json", optional: true)
.AddEnvironmentVariables()