加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

详解ASP.NET Core3.0 配置的Options模式

发布时间:2020-08-22 05:34:22 所属栏目:编程 来源:网络整理
导读:这篇文章首要先容了详解ASP.NET Core3.0 设置的Options模式,文中通过示例代码先容的很是具体,对各人的进修可能事变具有必然的参考进修代价,必要的伴侣们下面

总结:IOptions和IOptionsMonitor两种方法回收了Singleton模式,但区别在于IOptionsMonitor会监控对应数据源的变革,假如产生了变革则更新实例的设置值,但不会从头提供新的实例。IOptionsSnapshot方法回收了Scoped模式每次哀求回收统一个实例,在下一次哀求的时辰获取到的是一个新的实例,以是假如数据源产生了改变,会读取到新的值。先或许记一下这一的环境,在下文分解IOptions的内部处理赏罚机制的时辰就会大白为什么会这样。

4.数据更新提示

IOptionsMonitor方法还提供了一个OnChange要领,当数据源产生改变的时辰会触发它,以是假如想在这时辰做点什么,可以操作这个要领实现。示例代码:

_optionsMonitor.OnChange((theme,name)=> { Console.WriteLine(theme.Name +"-"+ name); });

5.不回收Configuration设置作为数据源的方法

上面的例子都是回收了读取设置的方法,现实上Options模式和上一章的Configuration设置方法使分隔的,读取设置只不外是Options模式的一种实现方法,譬喻可以不行使Configuration中的数据,直接通过如下代码注册:

services.Configure<Theme>("ThemeBlack", theme => { theme.Color = "#000000"; theme.Name = "Black"; });

6.ConfigureAll要领

体系提供了一个ConfigureAll要领,可以将全部对应的实例同一配置。譬喻如下代码:

services.ConfigureAll<Theme>(theme => { theme.Color = "#000000"; theme.Name = "Black2"; });

此时无论通过什么名称去获取Theme的实例,包罗不存在对应配置的名称,获取到的值都是本次通过ConfigureAll配置的值。

7.PostConfigure和PostConfigureAll要领

这两个要领和Configure、ConfigureAll要领相同,只是它们会在Configure、ConfigureAll之后执行。

8.多个Configure、ConfigureAll、PostConfigure和PostConfigureAll的执行次序

可以这样领略,每个Configure都是去修改一个名为其配置的名称的变量,以如下代码为例:

services.Configure<Theme>("ThemeBlack", theme => { theme.Color = "#000000"; theme.Name = "Black"; });

这条配置就是去修改(留意是修改而不是替代)一个名为"ThemeBlack"的Theme范例的变量,假如该变量不存在,则建设一个Theme实例并赋值。这样就天生了一些变量名为“空字符串、“ThemeBlue”、“ThemeBlack”的变量(只是举例,忽略空字符串作为变量名不正当的记挂)”。

依次凭证代码的次序执行,这时辰假如后头的代码中呈现同名的Configure,则修改对应名称的变量的值。假如是ConfigureAll要领,则修改全部范例为Theme的变量的值。

而PostConfigure和PostConfigureAll则在Configure和ConfigureAll之后执行,纵然Configure的代码写在了PostConfigure之后也是一样。

至于为什么会是这样的法则,下一节会具体先容。

二、内部处理赏罚机制理会
1. 体系启动阶段,依靠注入

上一节的例子中涉及到了三个接口IOptions、IOptionsSnapshot和IOptionsMonitor,那么就从这三个接口提及。既然Options模式是通过这三个接口的泛型方法注入提供处事的,那么在这之前体系就必要将它们对应的实现注入到依靠注入容器中。这产生在体系启动阶段建设IHost的时辰,这时辰HostBuilder的Build要领中挪用了一个services.AddOptions()要领,这个要领界说在OptionsServiceCollectionExtensions中,代码如下:

public static class OptionsServiceCollectionExtensions { public static IServiceCollection AddOptions(this IServiceCollection services) { if (services == null) { throw new ArgumentNullException(nameof(services)); } services.TryAdd(ServiceDescriptor.Singleton(typeof(IOptions<>), typeof(OptionsManager<>))); services.TryAdd(ServiceDescriptor.Scoped(typeof(IOptionsSnapshot<>), typeof(OptionsManager<>))); services.TryAdd(ServiceDescriptor.Singleton(typeof(IOptionsMonitor<>), typeof(OptionsMonitor<>))); services.TryAdd(ServiceDescriptor.Transient(typeof(IOptionsFactory<>), typeof(OptionsFactory<>))); services.TryAdd(ServiceDescriptor.Singleton(typeof(IOptionsMonitorCache<>), typeof(OptionsCache<>))); return services; } public static IServiceCollection Configure<TOptions>(this IServiceCollection services, Action<TOptions> configureOptions) where TOptions : class => services.Configure(Options.Options.DefaultName, configureOptions); public static IServiceCollection Configure<TOptions>(this IServiceCollection services, string name, Action<TOptions> configureOptions) where TOptions : class { //省略非空验证代码 services.AddOptions(); services.AddSingleton<IConfigureOptions<TOptions>>(new ConfigureNamedOptions<TOptions>(name, configureOptions)); return services; } public static IServiceCollection ConfigureAll<TOptions>(this IServiceCollection services, Action<TOptions> configureOptions) where TOptions : class => services.Configure(name: null, configureOptions: configureOptions); //省略部门代码 }

可见这个AddOptions要领的浸染就是举办处事注入,IOptions<>、IOptionsSnapshot<>对应的实现是OptionsManager<>,只是别离回收了Singleton和Scoped两种生命周期模式,IOptionsMonitor<>对应的实现是OptionsMonitor<>,同样为Singleton模式,这也验证了上一节例子中的意料。除了上面提到的三个接口外,尚有IOptionsFactory<>和IOptionsMonitorCache<>两个接口,这也是Options模式中很是重要的两个构成部门,接下来的内容中会用到。

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读