.NET CORE配置入门

.NET CORE配置入门

1.传统Web.config配置的缺点,之前DI讲到过

2.为了兼容,仍然可以使用Web.config和ConfigurationManager类,但不推荐

3…NET中的配置系统支持丰富的配置源,包括文件(json,xml,ini等),注册表,环境变量,命令行,Azure Key Vault等,还可以配置自定义配置源,可以跟踪的改变,可以按照优先级覆盖.

一.读取Json文件配置

{
  "name": "mcg",
  "age": "18",
  "proxy": {"address": "aa","port": "80" }
}

1.创建一个json文件,文件名随意,比如config.json,设置"如果较新则复制".参考备注

2.NuGet安装Microsoft.Extensions.Configuration和Microsoft.Extensions.Configuration.Json

3.编写代码,先用简单的方式读取配置

static void Main(string[] args)
{
    ConfigurationBuilder configBuilder = new ConfigurationBuilder();
    configBuilder.AddJsonFile("config.json", optional: true, reloadOnChange: true);
    IConfigurationRoot configRoot = configBuilder.Build();
    string name = configRoot["name"];
    Console.WriteLine($"name={name}");
    string add = configRoot.GetSection("proxy:address").Value;
    Console.WriteLine($"addr={add}");
    Console.ReadKey();
}

optional参数表示这个文件是否可选,初学时,建议optional设为false,这样写错了的话能够及时发现.

readOnChange参数表示如果文件修改了,是否重现加载配置

1.绑定读取配置

1)可以绑定一个类,自动完成配置的读取

2)NuGet安装:Microsoft.Extensions.Configuration.Binder

3)Server server = configRoot.GetSection(“proxy”).Get();

class Proxy
{
    public string Address { get; set; }
    public int Port { get; set; }
}
static void Main(string[] args)
{
    ConfigurationBuilder configBuilder = new ConfigurationBuilder();
    configBuilder.AddJsonFile("config.json", optional: false, reloadOnChange: true);
    IConfigurationRoot configRoot = configBuilder.Build();
    Proxy proxy = configRoot.GetSection("proxy").Get<Proxy>();
    Console.WriteLine($"{proxy.Address},{proxy.Port}");
    Console.ReadKey();
}
2.选项方式读取配置

1.推荐使用选项方式读取,和DI结合更好,且更好利用"reloadonchange"机制

2.NuGet安装:

Microsoft.Extensions.Options

Microsoft.Extensions.Binder

当然也需要Microsoft.Extensions.Configuration

Microsoft.Extensions.Configuration.Json

3.读取配置的时候,DI要声明IOptions,IOptionMonitor,IOptionsSnapshot等类型.IOptions不会读取到新的值;和IOptionsMonitor相比,IOptionsSnapshot会在同一个范围内(比如ASP.NET Core一个请求中)保持一致.建议用IOptionsSnapshot.

4.演示代码

class Config
{
    public string Name { get; set; }

    public int Age { get; set; }

    public Proxy Proxy{ get; set; }
}
class TestController
{
    //private readonly Config OptConfig;
    public IOptionsSnapshot<Config> optConfig;

    public TestController(IOptionsSnapshot<Config> optConfig)
    {
        this.optConfig = optConfig;
    }

    public void Test()
    {
        Console.WriteLine(optConfig.Value.Age);
        Console.WriteLine("----------------");
        Console.WriteLine(optConfig.Value.Age);
    }
}
class Test2
{
    private readonly IOptionsSnapshot<Proxy> optProxy;

    public Test2(IOptionsSnapshot<Proxy> optProxy)
    {
        this.optProxy = optProxy;
    }

    public void Test()
    {
        Console.WriteLine(optProxy.Value.Address);
    }
}
class Program
{
    static void Main(string[] args)
    {
        ServiceCollection services = new ServiceCollection();
        services.AddScoped<TestController>();
        services.AddScoped<Test2>();
        ConfigurationBuilder configBuilder = new ConfigurationBuilder();
        configBuilder.AddJsonFile("config.json", optional: false, reloadOnChange: true);
        IConfigurationRoot configRoot = configBuilder.Build();

        services.AddOptions().Configure<Config>(e => configRoot.Bind(e))
            .Configure<Proxy>(e=>configRoot.GetSection("proxy").Bind(e));

        using (var sp = services.BuildServiceProvider())
        {
            var c = sp.GetRequiredService<TestController>();
            c.Test();
            var c2 = sp.GetRequiredService<Test2>();
            c2.Test();
        }
        Proxy proxy = configRoot.GetSection("proxy").Get<Proxy>();
        Console.WriteLine($"{proxy.Address},{proxy.Port}");
        Console.ReadKey();
    }
}
3.命令行方式配置

1.配置框架还支持从命令行参数,环境变量等地方读取

2.NuGet安装

Microsoft.Extensions.Configuration.CommandLine

3.configBuilder.AddCommandLine(args)

4.参数支持多种格式,比如:server=127.0.0.1 , – server=127.0.0.1,–server 127.0.0.1(注意在键值之间加空格), /server 127.0.0.1 , /server 127.0.0.1(注意在键值之间加空格).格式不能混用

5.调试的时候,vs中简化命令行参数的方法

4.扁平化配置

1.对于环境变量,命令行等简单的键值对结构,如果想要进行复杂结构的配置,需要进行"扁平化处理".对于配置的名字需要采用"层级配置".

例如: a : b : c,对于数字这样配置 a :b : c:0,a :b : c:1,a :b : c:2

在这里插入图片描述

2.这个知识点在自定义配置Provider中还会用到

5.环境变量配置

1.NuGet安装

Microsoft.Extensions.Configuration.EnvironmentVariables

2.然后configurationBuilder.AddEnvironmentVariables()

AddEnvironmentVariables()有无参数和有prefix参数的两个重载版本.无参数版本会把程序相关的所有环境变量都加载进来,由于有可能和系统中已有的环境变量冲突,因此建议用有prefix参数的AddEnvironmentVariables().读取配置的时候,prefix参数会被忽略.

3.vs中调试时,避免修改系统环境变量,直接在vs中设置环境变量的方法

6.其他配置源

1.还支持ini,xml等格式的配置源,如果想用查询文档即可.

2.还支持在运行时,调试时加载不同的Json文件;

统中已有的环境变量冲突,因此建议用有prefix参数的AddEnvironmentVariables().读取配置的时候,prefix参数会被忽略.

3.vs中调试时,避免修改系统环境变量,直接在vs中设置环境变量的方法

6.其他配置源

1.还支持ini,xml等格式的配置源,如果想用查询文档即可.

2.还支持在运行时,调试时加载不同的Json文件;

3.还内置或者第三方支持中心化配置的服务器,比如使用Apollo,Nacos等开源服务器,或者使用Azure,阿里云等的配置服务.具体看文档即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值