.Net Core配置系统

目录

Json文件配置

读取配置原始方法

绑定读取配置

用法


  1. 传统Web.config配置的缺点
  2. 为了兼容,仍然可以使用Web.config和ConifgurationManager类,但不推荐
  3. .NET中的配置系统支持丰富的配置源,包括文件(json、xml、ini等)、注册表、环境变量、命令行、Azure Key Vault等,还可以配置自定义配资源。可以跟踪配置的改变,可以按照优先级覆盖。

Json文件配置

  1. 创建一个json文件,文件名随意,比如config.json,设置"如果较新则复制"
  2. NuGet安装Microsoft.Extensions.Configuration和Microsoft.Extensions.Configuration.Json
  3. 编写代码,先用简单的方式读取配置

{

"name": "ljy",

"age": "18",

"proxy": {

"address": "aa",

"port": "80"

}

}

读取配置原始方法
cs 复制代码
//创建配置构建器实例
ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
//添加JSON配置文件
configurationBuilder.AddJsonFile("config.json", optional: true, reloadOnChange: true);
//构建配置根对象
IConfigurationRoot config = configurationBuilder.Build();
//读取"name"配置项
string name = config["name"];
//读取"proxy:address"配置项
string proxyAddress = config.GetSection("proxy:address").Value;
  • optional:表示文件是否可选,建议optional设置为false,这样写错可及时发现
  • reloadOnChange:表示如果文件修改了,是否重新加载配置
绑定读取配置
  1. 可以绑定一个类,自动完成配置的读取
  2. NuGet安装:Microsoft.Extensions.Configuration.Binder
  3. Server server=configRoot.GetSection("proxy").Get<Server>()
cs 复制代码
class Program
{
    static void Main(string[] args)
    {
        ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
        configurationBuilder.AddJsonFile("config.json", optional: true, reloadOnChange: true);
        IConfigurationRoot configRoot = configurationBuilder.Build();
        //1
        //string name = configRoot["name"];
        //Console.WriteLine($"name={name}");
        //string address = configRoot.GetSection("proxy:address").Value;
        //Console.WriteLine($"address={address}");

        //2
        //Proxy proxy = configRoot.GetSection("proxy").Get<Proxy>();
        //Console.WriteLine($"{proxy.Address},{proxy.Port}");

        //3
        Config config =configRoot.Get<Config>();
        Console.WriteLine(config.Name);
        Console.WriteLine(config.Proxy.Address);
    }
}
class Config
{
    public string Name { get; set; }
    public int Age { get; set; }
    public Proxy Proxy { get; set; }
}
class Proxy
{
    public string Address { get; set; }
    public int Port { get; set; }
}
用法
  1. 推荐使用选项方式读取,和DI结合更好,且更好利用"reloadonchange"机制
  2. Nuget安装:Microsoft.Extensions.Options、Microsoft.Extensions.Configuration.Binder、Microsoft.Extensions.Configuration、Microsoft.Extensions.Configuration.Json
  3. 读取配置的时候,DI要声明IOptions<T>、IOptionsMonitor<T>、IOptionsSnapshot<T>等类型。IOptions<T>不会读取到新的值;和IOptionsMonitor相比,IOptionsSnapshot会在同一个范围内(比如ASP.NET Core一个请求中)保持一致。建议用IOptionsSnapshot
cs 复制代码
class Program
{
    static void Main(string[] args)
    {
        ServiceCollection services = new ServiceCollection();
        services.AddScoped<TestController>();
        services.AddScoped<Test2>();

        ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
        configurationBuilder.AddJsonFile("config.json", optional: true, reloadOnChange: true);
        IConfigurationRoot configRoot = configurationBuilder.Build();
        //使用services.AddOptions()方法将选项框架注册到服务容器中,Configure<Config>方法来配置Config类的实例。configRoot.Bind(e)是将配置根绑定到Config类的实例上,这样就可以从配置文件中读取相应的配置值并填充到Config类的属性中
        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();
        }
    }
}

class Config
{
    public string Name { get; set; }
    public int Age { get; set; }
    public Proxy Proxy { get; set; }
}

class Proxy
{
    public string Address { get; set; }
    public int Port { get; set; }
}

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

    public void Test()
    {
        Console.WriteLine(optConfig.Value.Age);
        Console.WriteLine(optConfig.Value.Proxy.Port);
    }
}

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

    public void Test()
    {
        Console.WriteLine(optProxy.Value.Address);
    }
}
相关推荐
leisoo80971 小时前
100GBA股股票数据怎么存ClickHouseRedisMySQLJSON完整对比
大数据·linux·服务器·开发语言·python
不会代码的小猴2 小时前
21. 泛型编程上
开发语言·c++·笔记·算法
一只旭宝2 小时前
细讲C加加【9】C++ std::function与std::bind详解|仿函数、绑定器、类成员绑定、占位符、成员偏移指针
开发语言·c++·算法
coder!mq5 小时前
说几个常见的语法糖?
java·开发语言·算法
gugucoding5 小时前
38. 【Java】Stream API(下):高级操作与性能
java·开发语言
Lhan.zzZ5 小时前
在 Visual Studio 2022 中打造可扩展的动态链接库模块:从零搭建到原理解析
开发语言·c++·visual studio
心平气和量大福大5 小时前
android-实例-蒲公英-更新与安装-5-签名与生成APK
android·java·开发语言
码哥DFS5 小时前
构造函数、实例对象、对象原型 ----三者关系
开发语言·javascript·原型模式
quantdash_cc6 小时前
告别自建 Requests/BS4 网页爬虫:基于 QuantDash 搭建零维保的高性能量化行情流水线
开发语言·爬虫·python·pandas·量化·quantdash
ydd1001006 小时前
寻找两个正序数组的中位数 Java 题解,二分分割详解
java·开发语言