.NET-配置

.NET-配置

导入依赖Microsoft.Extensions.Configuration.Json

{
  "name": "xiaobai",
  "age": "18",
  "proxy": {
    "address": "home"
  }
}

configurationBuilder

使用原始的方式直接读取配置类,可通过相关API获取其值

using Microsoft.Extensions.Configuration;

namespace ConsoleApp;

class Program
{
    static void Main(string[] args)
    {
        // 实例化configuration工厂类
        var configurationBuilder = new ConfigurationBuilder();
        
        // 调用AddJsonFile方法添加json文件,设置如果文件不存在则抛出异常,热更新
        configurationBuilder.AddJsonFile("config.json", optional: false, reloadOnChange: true);

        // 读取简单的键值对
        var configurationRoot = configurationBuilder.Build();
        var value = configurationRoot["name"];
        Console.WriteLine(value); // xiaobai
        
        // 读取复杂类型的键值对
        var value1 = configurationRoot.GetSection("proxy:address").Value;
        Console.WriteLine(value1); // home
    }
}

配置属性类

导入依赖Microsoft.Extensions.Configuration.Binder

我们可以通过相关的API将JSON中解析出来的内容直接赋值给类中属性,让这个类成为配置属性类

using Microsoft.Extensions.Configuration;

namespace ConsoleApp;

class Program
{
    static void Main(string[] args)
    {
        // 实例化configuration工厂类
        var configurationBuilder = new ConfigurationBuilder();
        
        // 调用AddJsonFile方法添加json文件,设置如果文件不存在则抛出异常,热更新
        configurationBuilder.AddJsonFile("config.json", optional: false, reloadOnChange: true);
        
        var configurationRoot = configurationBuilder.Build();
        // 链式调用方法Get(),使用配置属性类作为泛型,将以此类型的对象形式返回结果
        var config = configurationRoot.Get<config>();
        Console.WriteLine($"name:{config.Name}, age:{config.Age},proxy.address:{config.Proxy.Address}, proxy.port:{config.Proxy.Port}");
    }
}
/**
 * 配置属性类
 */
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 string Port { get; set; }
}

IOption*

有更简单的方式来处理数据

导入依赖

Microsoft.Extensions.Options

Microsoft.Extensions.Configuration(被依赖传递,无需导入)

Microsoft.Extensions.Configuration.Binder

Microsoft.Extensions.Configuration.Json

有三种接口

  • IOption<T>
  • IOptionMonitor<T>
  • IOptionSnapshot<T>

在ASP.NET中,一个请求就是一个作用域,所以建议使用IOptionsSnapshot来读取配置文件


TestController

以依赖注入的方式,将配置文件注入到属性中

using Microsoft.Extensions.Options;

namespace ConsoleApp;

public class TestController
{
    // 注入IOptionsSnapshot,以Config作为泛型传递
    private readonly IOptionsSnapshot<Config> optConfig;

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

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

调用框架扩展的Add方法,将Json文件的根绑定到类,并加入到IoC文件中

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

namespace ConsoleApp;

class Program
{
    static void Main(string[] args)
    {
        // 创建一个新的服务集合,用于注册依赖项
        var serviceCollection = new ServiceCollection();

        // 创建一个新的配置构建器,用于加载配置文件
        ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();

        // 添加 JSON 配置文件 "config.json",并指定它不是可选的,且在文件更改时重新加载配置
        configurationBuilder.AddJsonFile("config.json", optional: false, reloadOnChange: true);

        // 构建配置根对象,它包含了所有的配置数据
        var configurationRoot = configurationBuilder.Build();

        // 注册服务,同时将模型类绑定到根节点
        serviceCollection.AddOptions().Configure<Config>(e => configurationRoot.Bind(e));

        // 注册服务
        serviceCollection.AddScoped<TestController>();

        using (var sp = serviceCollection.BuildServiceProvider())
        {
            var requiredService = sp.GetRequiredService<TestController>();
            requiredService.Test();
        }
    }
}

/**
 * 配置属性类
 */
public class Config
{
    public string Name { get; set; }
    public int Age { get; set; }

    public Proxy Proxy { get; set; }
}

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

对象配置

我们除了可以将整个根节点挂载到类上,也可以将子节点分别挂载到类上

// 将根节点挂载到Config类上,并注入到容器中
serviceCollection.AddOptions().Configure<Config>(e => configurationRoot.Bind(e));
// 将proxy节点挂载到Proxy类上,并注入到容器中
serviceCollection.AddOptions().Configure<Proxy>(e => configurationRoot.GetSection("proxy").Bind(e));

至此,我们可以将配置文件挂载到类中属性上


自定义配置

自定义配置除了配置文件的方式还可以通过命令行参数和环境变量的方式来配置

而对于复杂结构的配置参数,需要对其进行扁平化处理

对于配置文件而言,支持多种格式的配置文件,例如ini、xml、yaml

具体用法查询相关文档即可

对于中心化的配置服务器,具体用法也查询相关文档即可