详解ASP.NET Core3.0 设置的Options模式
副问题[/!--empirenews.page--]
上一章讲到了设置的用法及内部处理赏罚机制,对付设置,ASP.NET Core还提供了一种Options模式。 一、Options的行使上一章有个设置的绑定的例子,可以将设置绑定到一个Theme实例中。也就是在行使对应设置的时辰,必要举办一次绑定操纵。而Options模式提供了更直接的方法,而且可以通过依靠注入的方法提供设置的读取。下文中称每一条Options设置为Option。 1.简朴的不为Option定名的方法依然回收这个例子,在appsettings.json中存在这样的设置: { "Theme": { "Name": "Blue", "Color": "#0921DC" } } 修改一下ValueController,代码如下: public class ValuesController : Controller { private IOptions<Theme> _options = null; public ValuesController(IOptions<Theme> options) { _options = options; } public ContentResult GetOptions() { return new ContentResult() { Content = $"options:{ _options.Value.Name}" }; } } 依然必要在Startup文件中做注册: public void ConfigureServices(IServiceCollection services) { services.Configure<Theme>(Configuration.GetSection("Theme")); services.AddControllersWithViews(); //3.0中启用的新要领 } 哀求这个Action,获取到的功效为: options:Blue 这样就可以在必要行使该设置的时辰通过依靠注入的方法行使了。但有个疑问,这里将“Theme”范例绑定了这样的设置,但假若有多个这样的设置呢?就犹如下面这样的设置的时辰: "Themes": [ { "Name": "Blue", "Color": "#0921DC" }, { "Name": "Red", "Color": "#FF4500" } ] 在这样的环境下,存在多个Theme的设置,这样对付之前这种依靠注入的方法就不可了。这时体系提供了将注入的Options举办定名的要领。 2.为Option定名的方法起首必要在Startup文件中注册的时辰对其定名,添加如下两条注册代码: services.Configure<Theme>("ThemeBlue", Configuration.GetSection("Themes:0")); services.Configure<Theme>("ThemeRed" , Configuration.GetSection("Themes:1")); 修改ValueController代码,添加IOptionsMonitor<Theme>和IOptionsSnapshot<Theme>两种新的注入方法如下: private IOptions<Theme> _options = null; private IOptionsMonitor<Theme> _optionsMonitor = null; private IOptionsSnapshot<Theme> _optionsSnapshot = null; public ValuesController(IOptions<Theme> options, IOptionsMonitor<Theme> optionsMonitor, IOptionsSnapshot<Theme> optionsSnapshot) { _options = options; _optionsMonitor = optionsMonitor; _optionsSnapshot = optionsSnapshot; } public ContentResult GetOptions() { return new ContentResult() { Content = $"options:{_options.Value.Name}," + $"optionsSnapshot:{ _optionsSnapshot.Get("ThemeBlue").Name }," + $"optionsMonitor:{_optionsMonitor.Get("ThemeRed").Name}" }; } 哀求这个Action,获取到的功效为: options:Blue,optionsSnapshot:Red,optionsMonitor:Gray 新增的两种注入方法通过Options的名称获取到了对应的Options。为什么是两种呢?它们有什么区别?不知道有没有读者想到上一章设置的从头加载成果。在设置注册的时辰,有个reloadOnChange选项,假如它被配置为true的,当对应的数据源产生改变的时辰,会举办从头加载。而Options怎么能少了这样的特征呢。 3.Option的自动更新与生命周期为了验证这三种Options的读取方法的特征,修改Theme类,添加一个Guid字段,并在结构要领中对其赋值,代码如下: public class Theme { public Theme() { Guid = Guid.NewGuid(); } public Guid Guid { get; set; } public string Name { get; set; } public string Color { get; set; } } 修改上例中的名为GetOptions的Action的代码如下: public ContentResult GetOptions() { return new ContentResult() { Content = $"options:{_options.Value.Name}|{_options.Value.Guid}," + $"optionsSnapshot:{ _optionsSnapshot.Get("ThemeBlue").Name }|{_optionsSnapshot.Get("ThemeBlue").Guid}," + $"optionsMonitor:{_optionsMonitor.Get("ThemeRed").Name}|{_optionsMonitor.Get("ThemeRed").Guid}" }; } 哀求这个Action,返回功效如下: options:Blue|ad328f15-254f-4505-a79f-4f27db4a393e,optionsSnapshot:Red|dba5f550-29ca-4779-9a02-781dd17f595a,optionsMonitor:Gray|a799fa41-9444-45dd-b51b-fcd15049f98f 革新页面,返回功效为: options:Blue|ad328f15-254f-4505-a79f-4f27db4a393e,optionsSnapshot:Red|a2350cb3-c156-4f71-bb2d-25890fe08bec,optionsMonitor:Gray|a799fa41-9444-45dd-b51b-fcd15049f98f 可见IOptions和IOptionsMonitor两种方法获取到的Name值和Guid值均未改变,而通过IOptionsSnapshot方法获取到的Name值未改变,但Guid值产生了改变,每次革新页面均会改变。这相同前面讲依靠注入时做测试的例子,此刻揣摩Guid未改变的IOptions和IOptionsMonitor两种方法是回收了Singleton模式,而Guid产生改变的IOptionsSnapshot方法是回收了Scoped或Transient模式。假如在这个Action中多次回收IOptionsSnapshot读取_optionsSnapshot.Get("ThemeBlue").Guid的值,会发明统一次哀求的值是沟通的,差异哀求之间的值是差异的,也就是IOptionsSnapshot方法使回收了Scoped模式(此验证示例较量简朴,请读者自行修改代码验证)。 在这样的环境下,修改三种获取方法对应的设置项的Name值,譬喻别离修改为“Blue1”、“Red1”和“Gray1”,再次多次革新页面查察返回值,会发明如下环境: IOptions方法:Name和Guid的值始终未变。Name值仍为Blue。 IOptionsSnapshot方法:Name值变为Red1,Guid值单次哀求内沟通,每次革新之间差异。 IOptionsMonitor方法:只有修改设置值后第一次革新的时辰将Name值变为了Gray1,Guid未改变。之后多次革新,这两个值均未做改变。 (编辑:河北网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |