gpt4 book ai didi

c# - 在 appSettings.json 文件中展开环境变量

转载 作者:行者123 更新时间:2023-12-03 16:21:54 32 4
gpt4 key购买 nike

有没有办法“开箱即用”在 appsettings.json 中设置环境变量?值自动扩展?

举一个人为的例子:

{
...
"MyPath1": "C:/MyApp/%ENV%/Myfolder1/MyFile1.dat",
"MyConnectionString": "Server=MyServer%ENV%..."
...
}

我的目标是能够通过更改单个环境变量来切换我的环境,并让它影响多个 appsetting 值,而不是拥有每个环境的配置文件。

更新

我看过 the source code of JsonConfigurationProvider据我所知,开箱即用没有这样的功能。

我可以看到应该可以通过从 JsonConfigurationProvider 派生自定义类来实现。并覆盖 Load()方法:
public override void Load()
{
base.Load();
foreach(var key in Data.Keys)
{
Data[key] = Environment.ExpandEnvironmentVariables(key);
}
}

但我对 .NET Core 配置还很陌生,这就引出了第二个问题:

我如何获得这个自定义实现来替换标准实现? IE。删除默认的 appsettings.json 和 appsettings.environment.json 提供程序并替换为自定义提供程序。大概要在 Program.cs 中添加一些内容:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureAppConfiguration(config =>
{
config.??? what do I need here?
}
);

最佳答案

要创建和使用自定义配置源,需要两个实现:

  • IConfigurationSource
  • IConfigurationProvider

  • 这是 IConfigurationSource添加到 IConfigurationBuilder 的实现的来源。该实现还负责创建自己的 IConfigurationProvider ,它负责从源加载数据。
    这是 IConfigurationSource 的自定义实现。 ( ExpandJsonConfigurationSource ) 和 IConfigurationProvider ( ExpandJsonConfigurationProvider):
    public class ExpandJsonConfigurationSource : JsonConfigurationSource
    {
    public override IConfigurationProvider Build(IConfigurationBuilder builder)
    {
    EnsureDefaults(builder);
    return new ExpandJsonConfigurationProvider(this);
    }
    }

    public class ExpandJsonConfigurationProvider : JsonConfigurationProvider
    {
    public ExpandJsonConfigurationProvider(ExpandJsonConfigurationSource source)
    : base(source) { }

    public override void Load()
    {
    base.Load();
    Data = Data.ToDictionary(
    x => x.Key,
    x => Environment.ExpandEnvironmentVariables(x.Value),
    StringComparer.OrdinalIgnoreCase);
    }
    }
    这里没有很多事情发生。这些实现只是遵循与现有 JsonConfigurationSource 相同的方法。和 JsonConfigurationProvider实现,具有用于扩展环境变量的自定义处理。
    要替换预配置的基于 JSON 的源,请使用以下命令:
    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
    .UseStartup<Startup>()
    .ConfigureAppConfiguration((ctx, builder) =>
    {
    var jsonConfigurationSources = builder.Sources
    .OfType<JsonConfigurationSource>()
    .ToList();

    foreach (var jsonConfigurationSource in jsonConfigurationSources)
    {
    var indexOfJsonConfigurationSource = builder.Sources
    .IndexOf(jsonConfigurationSource);

    builder.Sources.RemoveAt(indexOfJsonConfigurationSource);
    builder.Sources.Insert(
    indexOfJsonConfigurationSource,
    new ExpandJsonConfigurationSource
    {
    FileProvider = jsonConfigurationSource.FileProvider,
    Path = jsonConfigurationSource.Path,
    Optional = jsonConfigurationSource.Optional,
    ReloadOnChange = jsonConfigurationSource.ReloadOnChange
    });
    }
    });
    委托(delegate)传递给 ConfigureAppConfiguration执行以下操作:
  • 找到 JsonConfigurationSource 的所有已配置实例.应该有两个实例:对于 appsettings.json例如appsettings.Development.json .
  • 对于每个实例:
  • 确定实例在预配置源中的位置。
  • 删除实例。
  • 将删除的实例替换为 ExpandJsonConfigurationSource 的实例,跨属性复制以确保它具有相同的路径、可选标志等。
  • 关于c# - 在 appSettings.json 文件中展开环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60682780/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com