2

我有一个带有appsettings.json配置文件的 ASP.NET Core 应用程序。文件中的一项设置由对象数组表示,如下所示:

{
  "Globalization": {
    "Languages": [
      {
        "DisplayName": "Ru",
        "Code": "ru"
      },
      {
        "DisplayName": "En",
        "Code": "en"
      }
    ]
  }
}

在我们的 CI 系统中,我们使用环境变量来覆盖文件中的配置设置。事实证明,我只能覆盖现有项目或向数组添加新项目,但我无法使用索引表示法("Globalization__Languages__0__DisplayName"等)减少项目数量。

和 一样appsettings.{Environment}.json,即使我只有一个项目,我仍然有两种语言选项。

当然,我可以使基本配置为空或发明一些其他解决方法,但我错过了什么吗?有没有办法巧妙地覆盖减少项目数量的设置(最好在环境变量的帮助下)?

4

2 回答 2

0

所以默认配置是由虚拟主机构建的。它将包括 appsettings.json(可选)、appsettings.{environment}.json(可选)和环境变量。可悲的是,如果您在其中一个中设置不同的值,您仍然会收到所有值。

您可以做的是为特定环境手动构建配置,并且该环境文件将仅包含您未作为环境变量提供的信息。

为 IHostingEnvironment 创建扩展方法

public static class HostingEnvironmentExtensions
{
   public static bool IsCi(this IHostingEnvironment environment) 
   {
       return environment.EnvironmentName == "CI" // or give it what ever name you want.
   }
}

在构造函数中的启动类中执行以下操作

private readonly IConfiguration configuration;
public Startup(IConfiguration configuration, IHostingEnvironment environment)
{
    if (!environment.IsCi())
    {
        this.configuration = configuration;
        return;
    }

    this.configuration = new ConfigurationBuilder()
        .AddJsonFile(Path.Combine(AppContext.BaseDirectory, $"appsettings.{environment.EnvironmentName}.json"), false)
        .AddEnvironmentVariables()
        .Build();
}

现在您只会收到所需的配置,但需要一些开销。

于 2018-07-31T14:59:01.610 回答
0

微软社区做出了一个非常糟糕的决定,让数组以这种方式工作(恕我直言)。

作为解决方案,我们按如下方式解决:

{
  "Globalization": {
    "Languages": "ru|Ru,en|En"
  }
}

接着:

var langs = Configuration.GetSection("Globalization:Languages")
    .Split(',')
    .Select(x => x.Split('|'))
    .Select(x => new { Code = x[0], DisplayName = x[1] })
    .ToArray();

我的建议在这里

于 2021-10-22T12:07:02.843 回答