ASP.NETCoreWeb开发之OptionsPattern

    这节我们来讲一下,在ASP.NET Core Web开发中,读取配置文件信息的新方式:Options。

前言 /

Options

    在ASP.NET Web框架中,我们读取配置文件中的数据,在不使用第三方框架的情况下,可能需要通过ConfigurationManager这个类去读取配置文件中的信息,并且,如果我们人为更改了配置文件,需要重启系统才能使新的配置数据生效。这种方式并不能称得上优雅和高效。

    所以,在ASP.NET Core Web框架中,微软为我们提供了读取配置信息的新方式——将配置信息映射到数据类中,并且配合IOC,可以通过依赖注入的方式拿到这个类,读取我们想要的信息,下面就来了解一下它。

如何配置?/

Options

    首先,我们需要如下前置信息:

  • 在appsettings.json中配置要读取的信息(如下图,此处名称“MyOptions”可自定义)

f4516c4ebb1b8bdf3ba57da296c65eab.png

  • 对应的编写一个数据类

4e3cfc9aa0987788b976d876da1a59e1.png

    然后,我们就可以选择在Startup.cs中,编写配置相关代码(在Program.cs文件中也可以指定配置,具体大家可以参考官网文档),请看下图:

c6058e8a21f1cfaeeaf996f17b25f366.png

    在ConfigureServices方法中,我们可以配置Options。方式有很多种,此处仅演示比较简单的几种。通过使用services的Configure/AddOptions泛型方法,其泛型类型为要映射的类,然后指定要读取的区域(即Section),即可完成配置。默认如果不指定SectionName,则自动使用类名进行匹配,如果读取SectionName跟映射的类名不一致,则使用其重载方法,传入SectionName即可。

IOptions<T>/

Options

    在完成配置以后,就可以使用依赖注入的方式,在需要的地方获取到配置信息,注入的形式之一是IOptions<T>接口,泛型T则指定为映射的配置类,请看下图:

8e147e0f4f998ec2ebe67a8dbd7addc7.png

    使用IOptions<T>注入的配置对象,不具有动态性,也就是说系统运行时修改配置文件,是不会自动更新的。所以可以在类中直接声明配置类对象,在构造方法中直接从IOptions的Value属性中取到。

    让我们打印出来看一下:

edde778d205ecb6e62e7127a7a42eec7.png

a74427bce5021e577315a564ddda0760.png

    这样的形式,是优雅的,面向对象的,但是在系统的整个运行过程中,使用IOptions<T>注入的配置对象,是不会随配置信息的改变而变化的,也就说,还是要重启才能看到配置信息的更改。

IOptionsSnapshot<T>/

Options

    当然,除了IOptions<T>,我们还可以使用IOptionsSnapshot<T>去注入配置对象:

29c67e0036b20200df0fd21e00b148a8.png

    IOptionsSnapshot接口,提供了对配置信息的更新功能,但是并不是实时的,在同一个域或者本次请求中如果出现配置信息更改,配置对象中的数据是不会变化的,也就是保证整个上下文中的配置信息不会改变。为此,上述代码中我与IOptions做出对比,第一次请求数据两者相同,为初始值:

//第 1 次请求
IOptions:name:Charles,age:18,profession:.NET Developer
IOptionsSnapshot:name:Charles,age:18,profession:.NET Developer

然后我修改配置文件,进行第二次请求,IOptionsSnapshot重新读取了配置信息:

d5a8f41d3d3845aa79b09bd9648fe10a.png

//第 2 次请求
IOptions:name:Charles,age:18,profession:.NET Developer
IOptionsSnapshot:name:宿春磊,age:19,profession:.NET 开发者

IOptionsMonitor<T>/

Options

    最后,除了IOptionsSnapshot,微软还提供了IOptionsMonitor,这位则是提供“全天候”的配置监控服务,配置文件一改,它就立刻更新,请看下图:

c86055ad506e446b4615a9038e00dd0d.png

    我将三者做一对比,在读取前就通过代码更新配置文件,因为OptionsPattern是延迟读取的,所以在改之前使IOptionsSnapshot读取一遍值,这样才能体现出三者的不同:

//第 1 次请求
IOptions:name:宿春磊,age:19,profession:.NET 开发者
IOptionsSnapshot:name:宿春磊,age:19,profession:.NET 开发者
IOptionsMonitor:name:宿春磊Charles,age:19,profession:.NET 开发者

    第二次请求的时候,IOptionsSnapshot才取到新值。

//第 2 次请求
IOptions:name:宿春磊,age:19,profession:.NET 开发者
IOptionsSnapshot:name:宿春磊Charles,age:19,profession:.NET 开发者
IOptionsMonitor:name:宿春磊Charles,age:19,profession:.NET 开发者

本节到此结束...


参考:

https://docs.microsoft.com/zh-CN/dotnet/core/extensions/options

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值