ASP.NET Core 中的配置

ASP.NET Core 中的配置是使用一个或多个配置提供程序执行的。 配置提供程序使用各种配置源从键值对读取配置数据:

  • 设置文件,例如 appsettings.json
  • 环境变量
  • 命令行参数
  • 内存中的 .NET 对象

内存中的.NET对象

MemoryConfigurationProvider 使用内存中集合作为配置键值对。

以下代码将内存集合添加到配置系统中:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args)
    {
        var Dict = new Dictionary<string, string>
        {
           {"MyKey", "Dictionary MyKey Value"},
           {"Position:Title", "Dictionary_Title"},
           {"Position:Name", "Dictionary_Name" },
           {"Logging:LogLevel:Default", "Warning"}
        };

        return Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.AddInMemoryCollection(Dict);
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
    }
}

以下示例代码显示了上述配置设置:

public class TestModel : PageModel
{
    // requires using Microsoft.Extensions.Configuration;
    private readonly IConfiguration Configuration;

    public TestModel(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public ContentResult OnGet()
    {
        var myKeyValue = Configuration["MyKey"];
        var title = Configuration["Position:Title"];
        var name = Configuration["Position:Name"];
        var defaultLogLevel = Configuration["Logging:LogLevel:Default"];


        return Content($"MyKey value: {myKeyValue} 
" +
                       $"Title: {title} 
" +
                       $"Name: {name} 
" +
                       $"Default Log Level: {defaultLogLevel}");
    }
}

命令行配置提供程序

组件包:Microsoft.Extensions.Configuration.CommandLine

支持的命令格式:

  • 无前缀的key=value模式
  • 双中横线模式 --key=value 或 --key value
  • 正斜杠模式 /key=value 或 /key value

Tips:等号分隔符和空格分隔符不能混用

命令替换模式(为命令取别名):

  • 必须以单划线 (-) 或双划线 (--)开头
  • 映射字典不能包含重复Key

我们创建一个.Net Core Console项目,为项目添加组件包

设置程序参数:

class Program
{
    static void Main(string[] args)
    {
        var builder = new ConfigurationBuilder();

        builder.AddCommandLine(args);

        var configurationRoot = builder.Build();

        Console.WriteLine($"CommandLineKey1: {configurationRoot["Key1"]}");
        Console.WriteLine($"CommandLineKey2: {configurationRoot["Key2"]}");
        Console.WriteLine($"CommandLineKey3: {configurationRoot["Key3"]}");
        Console.ReadKey();
    }
}

输出结果:

我们在试试用k1变量的值来替换Key1

 添加映射:

 查看输出:

环境变量配置

组件包:Microsoft.Extensions.Configuration.EnvironmentVariables

使用场景:

  • 在 Docker 中运行时
  • 在 Kubernets 中运行时
  • 需要设置 ASP.NET Core 的一些内置特殊配置时

由于容器的环境隔离能力,使得我们可以使用环境变量来配置我们的应用程序。

特征:

所有平台上的环境变量分层键都不支持 : 分隔符。

__(双下划线):

  • 受所有平台支持。 例如,Bash 不支持 : 分隔符,但支持 __
  • 自动替换为 :

在调试环境下注入:

 提取方法大同小异就不在赘述。

前缀过滤:

使用builder.AddEnvironmentVariables("Min_");方法则可过滤掉除了前缀为Min_的其他环境变量。


文件配置提供程序

FileConfigurationProvider 是从文件系统加载配置的基类。 以下配置提供程序派生自 FileConfigurationProvider

JSON 配置提供程序

JsonConfigurationProvider 从 JSON 文件键值对加载配置。

重载可以指定:

  • 文件是否可选。
  • 如果文件更改,是否重载配置。
C#
public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.AddJsonFile("MyConfig.json", 
                    optional: true, 
                    reloadOnChange: true);
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

前面的代码:

  • 通过以下选项将 JSON 配置提供程序配置为加载 MyConfig.json 文件:
    • optional: true:文件是可选的。
    • reloadOnChange: true:保存更改后会重载文件。应用程序在读取Json的值在文件变化时,读取的值也会变化。
Json
{
"Position": { "Title": "“我的配置”标题", "Name": "My Config Smith" }, "MyKey": "MyConfig.json Value", "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "AllowedHosts": "*" }
public class TestModel : PageModel
{
    // requires using Microsoft.Extensions.Configuration;
    private readonly IConfiguration Configuration;

    public TestModel(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public ContentResult OnGet()
    {
        var myKeyValue = Configuration["MyKey"];
        var title = Configuration["Position:Title"];
        var name = Configuration["Position:Name"];
        var defaultLogLevel = Configuration["Logging:LogLevel:Default"];


        return Content($"MyKey value: {myKeyValue} 
" +
                       $"Title: {title} 
" +
                       $"Name: {name} 
" +
                       $"Default Log Level: {defaultLogLevel}");
    }
}
原文地址:https://www.cnblogs.com/Xieyiincuit/p/13976984.html