.net 温故知新:【8】.NET 中的配置从xml转向json( 二 )

并返回指定的类型 。两种方式都可以使用,看实际需求和用途 。
四、选项依赖注入在控制台程序中我们引用DI注入包,然后演示下如何进行配置的注入 。关于DI和IOC不清楚的看我上篇文章.net 温故知新:【7】IOC控制反转,DI依赖注入

  • 新建一个测试类TestOptionDI
public class TestOptionDI{private readonly IOptionsSnapshot<Config> _options;public TestOptionDI(IOptionsSnapshot<Config> options){_options = options;}public void Test(){Console.WriteLine("DI测试输出:");Console.WriteLine($"姓名:{_options.Value.person.name}");Console.WriteLine($"年龄:{_options.Value.person.age}");}}在测试类中我们使用IOptionsSnapshot<T>接口作为依赖注入,还有其它不同定义的接口用来配置注入,关于选项接口: 。
.net 温故知新:【8】.NET 中的配置从xml转向json

文章插图
不同接口可以配合读取配置的不同方式起作用,IOptionsSnapshot接口可以在配置文件改变后不同作用域进行刷新配置 。接着我们修改main方法,引入DI,并将AddJsonFile方法的参数reloadOnChange设置为true,optional参数是否验证文件存在,建议开发时都设置为true,这样如果文件有问题会进行报错 。注入配置这句services.AddOptions().Configure<Config>(e=>configuration.Bind(e))是关键,通过容器调用AddOptions方法注册,然后Configure方法里面是一个委托方法,该委托的作用就是将配置的信息绑定到Config类型的参数e上 。注册到容器的泛型选项接口,这样在TestOptionDI类构造函数注入就能注入IOptionsSnapshot了,这里有点绕 。
static void Main(string[] args){IConfiguration configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json",optional:true,reloadOnChange:true).Build();//IServiceCollection 服务ServiceCollection services = new ServiceCollection();//注入配置services.AddOptions().Configure<Config>(e=>configuration.Bind(e));//注入TestOptionDIservices.AddScoped<TestOptionDI>();using (var provider = services.BuildServiceProvider()){//获取服务var testOption = provider.GetRequiredService<TestOptionDI>();testOption.Test();}Console.ReadLine();}
.net 温故知新:【8】.NET 中的配置从xml转向json

文章插图
为了测试IOptionsSnapshot接口在不同作用域会刷新配置,我们修改下main方法,用一个while循环在ReadLine时修改json文件值,不同的Scope里进行打印 。
using (var provider = services.BuildServiceProvider()){while (true){using (var scope = provider.CreateScope()){//获取服务var testOption = scope.ServiceProvider.GetRequiredService<TestOptionDI>();testOption.Test();}Console.ReadLine();}}
.net 温故知新:【8】.NET 中的配置从xml转向json

文章插图
这个功能在web中使用很方便,因为框架的一次请求就是一个作用域,所以我们修改了配置 , 下次请求就能生效了 , 而不用重启服务 。
五、其它配置如最开始所说,不仅能配置json文件 , 由于各种提供程序,还可以配置其它的,但是根据配置的顺序会进行覆盖 。我们只添加一个环境变量配置演示下:首先添加提供程序包:Install-Package Microsoft.Extensions.Configuration.EnvironmentVariables 。然后添加环境变量配置代码AddEnvironmentVariables()
IConfiguration configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json",optional:true,reloadOnChange:true).AddEnvironmentVariables().Build();在VS中配置临时环境变量
.net 温故知新:【8】.NET 中的配置从xml转向json

文章插图
这里有个扁平化配置,就是表示层级用冒号person:age
.net 温故知新:【8】.NET 中的配置从xml转向json

文章插图
六、托管模式对于web项目我们没有进行这么多操作它是怎么配置的呢,其实框架已经自动帮我们做了,其它非web项目也可以使用这种托管模式,在Microsoft.Extensions.Hosting 包中,只需要使用简单的代码就能配置好 。
IHost host = Host.CreateDefaultBuilder(args).Build();await host.RunAsync();其加载配置的优先级:
.net 温故知新:【8】.NET 中的配置从xml转向json

文章插图
通过分析我们对整个配置如何运行的机制有了一个大体的了解,如果想详细了解托管模式的还是建议看官方文档:.NET配置
【.net 温故知新:【8】.NET 中的配置从xml转向json】

推荐阅读