千家信息网

ASP.NET Core中的Options选项模式怎么配置

发表于:2025-11-13 作者:千家信息网编辑
千家信息网最后更新 2025年11月13日,这篇文章主要介绍"ASP.NET Core中的Options选项模式怎么配置"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"ASP.NET Core中的Opti
千家信息网最后更新 2025年11月13日ASP.NET Core中的Options选项模式怎么配置

这篇文章主要介绍"ASP.NET Core中的Options选项模式怎么配置"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"ASP.NET Core中的Options选项模式怎么配置"文章能帮助大家解决问题。

1.前言

选项(Options)模式是对配置(Configuration)的功能的延伸。在12章(ASP.NET Core中的配置二)Configuration中有介绍过该功能(绑定到实体类、绑定至对象图、将数组绑定至类)而选项模式又有个选项类(TOptions),该选项类作用是指:把选项类中的属性与配置来源中的键关联起来。举个例,假设json文件有个Option1键,选项类中也有个叫Option1的属性名,经过选项配置,这样就能把json中的键的值映射到选项类属性值中。也可以理解在项目应用中,把一个json文件序列化到.net类。

2.常规选项配置

选项类必须为包含公共无参数构造函数的非抽象类。在appsettings.json文件中添加option1、option2、subsection的配置:

{  "option1": "value1_from_json",  "option2": -1,  "subsection": {    "suboption1": "subvalue1_from_json",    "suboption2": 200  },  "Logging": {    "LogLevel": {      "Default": "Warning"    }  },  "AllowedHosts": "*"}

新建MyOptions类(Models/MyOptions.cs),以下类MyOptions具有三种属性:Option1和 Option2。设置默认值为可选,但以下示例中的类构造函数设置了Option1的默认值。Option2具有通过直接初始化属性设置的默认值:

public class MyOptions{    public MyOptions()    {        // Set default value.        Option1 = "value1_from_ctor";    }    public string Option1 { get; set; }    public int Option2 { get; set; } = 5;}

而MyOptions类通过Configure添加到服务容器并绑定到配置:

public void ConfigureServices(IServiceCollection services){    // Example #1: General configuration    // Register the Configuration instance which MyOptions binds against.    services.Configure(Configuration);}

也可以使用自定义ConfigurationBuilder从设置文件加载选项配置时,确认基路径设置正确,添加到服务容器并绑定到配置:

var configBuilder = new ConfigurationBuilder()   .SetBasePath(Directory.GetCurrentDirectory())   .AddJsonFile("appsettings.json", optional: true);var config = configBuilder.Build();services.Configure(config);

以下页面模型通过IOptionsMonitor使用构造函数依赖关系注入来访问设置 (Pages/Index.cshtml.cs):

public class IndexModel{    public IndexModel(IOptionsMonitor optionsAccessor)    {        _options = optionsAccessor.CurrentValue;    }    private readonly MyOptions _options;    public void OnGet()    {        // Example #1: Simple options        var option1 = _options.Option1;        var option2 = _options.Option2;        var simpleOptions = $"option1 = {option1}, option2 = {option2}";    }}

在Home/Index控制器Action下调用IndexModel.OnGet方法返回包含选项值的字符串:

public HomeController(IOptionsMonitor optionsAccessor){    _optionsAccessor = optionsAccessor;}private readonly IOptionsMonitor _optionsAccessor;public IActionResult Index(){    IndexModel indexModel = new IndexModel(_optionsAccessor);    indexModel.OnGet();    return View();}

3.通过委托配置简单选项

使用委托设置选项值。此示例应用程序使用新建MyOptionsWithDelegateConfig类 (Models/MyOptionsWithDelegateConfig.cs):

public class MyOptionsWithDelegateConfig{    public MyOptionsWithDelegateConfig()    {        // Set default value.        Option1 = "value1_from_ctor";    }    public string Option1 { get; set; }    public int Option2 { get; set; } = 5;}

向服务容器添加IConfigureOptions服务。它通过MyOptionsWithDelegateConfig使用委托来配置绑定:

public void ConfigureServices(IServiceCollection services){    // Example #2: Options bound and configured by a delegate    services.Configure(myOptions =>    {        myOptions.Option1 = "value1_configured_by_delegate";        myOptions.Option2 = 500;    });}

以下页面模型通过IOptionsMonitor使用构造函数依赖关系注入来访问设置 (Pages/Index.cshtml.cs):

public class IndexModel{    private readonly MyOptionsWithDelegateConfig _optionsWithDelegateConfig;    public IndexModel(IOptionsMonitor optionsAccessorWithDelegateConfig)    {        _optionsWithDelegateConfig = optionsAccessorWithDelegateConfig.CurrentValue;    }    public void OnGet()    {        // Example #2: Options configured by delegate        var delegate_config_option1 = _optionsWithDelegateConfig.Option1;        var delegate_config_option2 = _optionsWithDelegateConfig.Option2;        var simpleOptionsWithDelegateConfig =                $"delegate_option1 = {delegate_config_option1}, " +                $"delegate_option2 = {delegate_config_option2}";    }}

在Home/Index控制器Action下调用IndexModel.OnGet方法返回包含选项值的字符串:

public HomeController(IOptionsMonitor optionsAccessorWithDelegateConfig){    _optionsAccessorWithDelegateConfig = optionsAccessorWithDelegateConfig;}private readonly IOptionsMonitor _optionsAccessorWithDelegateConfig;public IActionResult Index(){    IndexModel indexModel = new IndexModel(_optionsAccessorWithDelegateConfig);    indexModel.OnGet();    return View();}

每次调用Configure都会将IConfigureOptions服务添加到服务容器。在前面的示例中,Option1和Option2的值同时在appsettings.json中指定,但Option1和Option2的值被配置的委托替代。当启用多个配置服务时,指定的最后一个配置源优于其他源,由其设置配置值。运行应用程序时,页面模型的OnGet方法返回显示选项类值的字符串。

4.子选项配置

将选项绑定到配置时,选项类型中的每个属性都将绑定到窗体property[:sub-property:]的配置键。例如,MyOptions.Option1属性将绑定到从appsettings.json中的option1属性读取的键Option1。在以下代码中,已向服务容器添加IConfigureOptions服务。它将MySubOptions绑定到appsettings.json文件的subsection部分:

public void ConfigureServices(IServiceCollection services){    // Example #3: Suboptions    // Bind options using a sub-section of the appsettings.json file.    services.Configure(Configuration.GetSection("subsection"));}

新建MySubOptions类(Models/MySubOptions.cs)将属性SubOption1和SubOption2定义为保留选项值:

public class MySubOptions{    public MySubOptions()    {        // Set default values.        SubOption1 = "value1_from_ctor";        SubOption2 = 5;    }    public string SubOption1 { get; set; }    public int SubOption2 { get; set; }}

以下页面模型通过IOptionsMonitor使用构造函数依赖关系注入来访问设置(Pages/Index.cshtml.cs):

public class IndexModel{    private readonly MySubOptions _subOptions;    public IndexModel(IOptionsMonitor subOptionsAccessor)    {        _subOptions = subOptionsAccessor.CurrentValue;    }    public void OnGet()    {        // Example #3: Suboptions        var subOption1 = _subOptions.SubOption1;        var subOption2 = _subOptions.SubOption2;        var subOptions = $"subOption1 = {subOption1}, subOption2 = {subOption2}";    }}

在Home/Index控制器Action下调用IndexModel.OnGet方法返回包含选项值的字符串:

public HomeController(IOptionsMonitor subOptionsAccessor){    _subOptionsAccessor = subOptionsAccessor;}private readonly IOptionsMonitor _subOptionsAccessor;public IActionResult Index(){    IndexModel indexModel = new IndexModel(_subOptionsAccessor);    indexModel.OnGet();    return View();}

5.通过IOptionsSnapshot重新加载配置数据

IOptionsSnapshot针对请求生命周期访问和缓存选项时,每个请求只能计算一次选项。以下示例演示如何在更改appsettings.json(Pages/Index.cshtml.cs)后创建新的 IOptionsSnapshot。在更改appsettings.json文件和重新加载配置之前,针对服务器的多个请求返回appsettings.json文件提供的配置键值。

public class IndexModel{    private readonly MyOptions _snapshotOptions;    public IndexModel(IOptionsSnapshot snapshotOptionsAccessor)    {        _snapshotOptions = snapshotOptionsAccessor.Value;    }    public void OnGet()    {        // Example #5: Snapshot options        var snapshotOption1 = _snapshotOptions.Option1;        var snapshotOption2 = _snapshotOptions.Option2;        var snapshotOptions = $"snapshot option1 = {snapshotOption1}, " + $"snapshot option2 = {snapshotOption2}";    }}

下面显示从appsettings.json文件加载的初始option1和option2值:

snapshot option1 = value1_from_json, snapshot option2 = -1

将appsettings.json文件中的值更改为value1_from_json UPDATED和200。保存appsettings.json 文件。刷新浏览器,查看更新的选项值:

snapshot option1 = value1_from_json UPDATED, snapshot option2 = 200

6.包含IConfigureNamedOptions的命名选项支持

命名选项支持允许应用程序在命名选项配置之间进行区分。命名选项通过OptionsServiceCollectionExtensions.Configure进行声明,其调用扩展方法ConfigureNamedOptions.Configure:

public void ConfigureServices(IServiceCollection services){    // Example #6: Named options (named_options_1)    // Register the ConfigurationBuilder instance which MyOptions binds against.    // Specify that the options loaded from configuration are named    // "named_options_1".    services.Configure("named_options_1", Configuration);    // Example #6: Named options (named_options_2)    // Specify that the options loaded from the MyOptions class are named    // "named_options_2".    // Use a delegate to configure option values.    services.Configure("named_options_2", myOptions =>    {        myOptions.Option1 = "named_options_2_value1_from_action";    });}

通过OnGet(Pages/Index.cshtml.cs)访问命名选项:

public class IndexModel{    private readonly MyOptions _named_options_1;    private readonly MyOptions _named_options_2;    public IndexModel(IOptionsSnapshot namedOptionsAccessor)    {        _named_options_1 = namedOptionsAccessor.Get("named_options_1");        _named_options_2 = namedOptionsAccessor.Get("named_options_2");    }    public void OnGet()    {        // Example #6: Named options        var named_options_1 =            $"named_options_1: option1 = {_named_options_1.Option1}, " +            $"option2 = {_named_options_1.Option2}";        var named_options_2 =            $"named_options_2: option1 = {_named_options_2.Option1}, " +            $"option2 = {_named_options_2.Option2}";        var namedOptions = $"{named_options_1} {named_options_2}";    }}

在Home/Index控制器Action下调用IndexModel.OnGet方法返回包含选项值的字符串:

public HomeController(IOptionsSnapshot namedOptionsAccessor){    _namedOptionsAccessor = namedOptionsAccessor;}private readonly IOptionsSnapshot _namedOptionsAccessor;public IActionResult Index(){    IndexModel indexModel = new IndexModel(_namedOptionsAccessor);    indexModel.OnGet();    return View();}

使用ConfigureAll方法配置所有选项

使用ConfigureAll方法可以配置所有选项实例。以下代码将针对包含公共值的所有配置实例配置Option1。将以下代码手动添加到Startup.ConfigureServices方法:

services.ConfigureAll(myOptions =>{    myOptions.Option1 = "ConfigureAll replacement value";});

在Home/Index控制器Action下调用IndexModel.OnGet方法返回包含选项值的字符串:

关于"ASP.NET Core中的Options选项模式怎么配置"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。

配置 方法 文件 服务 属性 字符 字符串 模式 函数 容器 控制器 控制 模型 示例 页面 委托 应用 代码 应用程序 知识 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 怎样引其他表格的数据库 极限国度试玩版连不上服务器 命令行如何开启数据库 增强网络安全意识讨论 二手游戏服务器 上海网络安全保险标准规范制定 浏览器与网络服务器之间的协议 泉州楠瓜互联网科技有限公司 用友软件开发的前景怎么样 滨湖区创新软件开发方法 郑州兰盾网络技术有限公司 软件开发那种工资高 天龙八部服务器哪个人多 上海友游网络技术 2021网络安全周网上答题 浙江服务器维修技术 网络服务器安全访问系统 山东钢板套料软件开发商 网络安全与计算机应用哪个好 vikor存储服务器 网络安全防护需要证书吗 中国网络安全组长 幼儿教师网络安全宣传活动 计算机网络技术的行业发展 长园深瑞电力网络安全监测装置 部队网络安全心得体会600字 颍上县软件开发技术项目实训中心 服务器cpu如何区分单路双路 dell服务器e02s图片 中山市erp软件开发公司
0