.net 读取配置文件 使用DI方式

发布时间 2023-11-30 10:05:10作者: Simian_2018_12_22

需要引用包:
Microsoft.Extensions.Configuration 配置文件类库
Microsoft.Extensions.Configuration.Binder 将配置文件转换成实体类的类库
Microsoft.Extensions.Configuration.Json 读取Json文件的类库
Microsoft.Extensions.DependencyInjection DI类库
Microsoft.Extensions.Options 热加载类库

1. 先创建一个配置文件config.json,并将属性->复制到输出目录->如果较新则复制

config.json内容如下:

{
  "name": "张三",
  "age": "18",
  "students": {
    "name": "张同学",
    "age": 22
  }
}

2. 创建配置文件对象的实体类:

internal class Student
{
    public int age { get; set; }
    public string Name { get; set; }
}
internal class Teacher
{
    public string Name { get; set; }
    public int Age { get; set; }
    public Student Students { get; set; }
}

3. 创建使用到配置文件的类

internal class Test
{
    private readonly IOptionsSnapshot<Teacher> _optionsSnapshot;
    //private readonly IOptionsMonitor<Teacher> _optionsMonitor;
    public Test(IOptionsSnapshot<Teacher> optionsSnapshot)
    //public Test(IOptionsMonitor<Teacher> optionsMonitor)
    {
        this._optionsSnapshot = optionsSnapshot;
    }
    public void Run()
    {
        //Teacher teacher = this._optionsMonitor.CurrentValue;
        Teacher teacher = this._optionsSnapshot.Value;
        Console.WriteLine(teacher.Name);
        Console.WriteLine(teacher.Age);
    }
}

IOptionsSnapshot:在一个范围内,不会重新加载配置文件的内容,但出了范围后如果配置文件内容修改了,则重新加载。
IOptionsMonitor:配置文件的内容只会在启动时候加载

4. 在Main函数中注册读取配置文件的服务

static void Main(string[] args)
{
    // 实例化DI
    ServiceCollection services = new ServiceCollection();
    // 配置文件构造类
    ConfigurationBuilder builder = new ConfigurationBuilder();
    // 在类中添加本地的配置文件
    builder.AddJsonFile("config.json", false, true);
    // 初始化配置文件
    IConfigurationRoot config = builder.Build();
    // 在DI中注册配置文件的服务
    services.AddOptions().Configure<Teacher>(e=>config.Bind(e));
    services.AddScoped<Test>();
    using(ServiceProvider sp = services.BuildServiceProvider())
    {
        while (true)
        {
			// 创建一个范围
            using(IServiceScope scope = sp.CreateScope())
            {
                Test test = scope.ServiceProvider.GetRequiredService<Test>();
                test.Run();
                Console.ReadKey();
                test.Run();
                Console.ReadKey();
            }
        }

    }
    Console.ReadKey();
}