绑定配置
IConfiguration configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();Config options = new Config();ConfigurationBinder.Bind(configuration, options);Person person = configuration.GetSection("person").Get<Person>();Console.WriteLine(options.person.name);Console.WriteLine(options.person.age);Console.WriteLine("-----------GetSection获取-------------");Console.WriteLine(person.name);Console.WriteLine(person.age);
文章插图
用了两种方式获取配置,第一种使用
ConfigurationBinder.Bind()
将整个配置绑定到对象Config
上,另外一种是使用IConfiguration的GetSection().Get<T>()
并返回指定的类型 。两种方式都可以使用,看实际需求和用途 。四、选项依赖注入在控制台程序中我们引用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}");}}
【.net 温故知新:【8】.NET 中的配置从xml转向json】在测试类中我们使用IOptionsSnapshot<T>
接口作为依赖注入,还有其它不同定义的接口用来配置注入,关于选项接口: 。文章插图
不同接口可以配合读取配置的不同方式起作用,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();}
文章插图
为了测试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();}}
文章插图
这个功能在web中使用很方便,因为框架的一次请求就是一个作用域,所以我们修改了配置,下次请求就能生效了,而不用重启服务 。
经验总结扩展阅读
- C# Interlocked 类
- 常用CSS样式属性
- 2022年小雪节气能办婚宴吗
- 2022年农历腊月十一结婚日子如何
- 2023年农历八月初三搬家吉日 2023年9月17日适合搬家吗
- 迷你世界8月28日有哪些礼包
- 2022年12月24日平安夜适合乔迁吗
- 下个月痴迷旧爱 3大星座痴爱缠绵旧爱上门
- iqoo neo5优缺点_iqooneo5的缺点
- 2023年农历八月初三宜粉刷墙壁吗 2023年9月17日粉刷墙壁好吗