返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >ASP.NETCore中的Options选项模式
  • 491
分享到

ASP.NETCore中的Options选项模式

2024-04-02 19:04:59 491人浏览 薄情痞子
摘要

1.前言 选项(Options)模式是对配置(Configuration)的功能的延伸。在12章(ASP.net core中的配置二)Configuration中有介绍过该功能(绑定

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<MyOptions>(Configuration);
}

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

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

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

public class IndexModel
{
    public IndexModel(IOptionsMonitor<MyOptions> 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<MyOptions> optionsAccessor)
{
    _optionsAccessor = optionsAccessor;
}
private readonly IOptionsMonitor<MyOptions> _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<TOptions>服务。它通过MyOptionsWithDelegateConfig使用委托来配置绑定:

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

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

public class IndexModel
{
    private readonly MyOptionsWithDelegateConfig _optionsWithDelegateConfig;
    public IndexModel(IOptionsMonitor<MyOptionsWithDelegateConfig> 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<MyOptionsWithDelegateConfig> optionsAccessorWithDelegateConfig)
{
    _optionsAccessorWithDelegateConfig = optionsAccessorWithDelegateConfig;
}
private readonly IOptionsMonitor<MyOptionsWithDelegateConfig> _optionsAccessorWithDelegateConfig;
public IActionResult Index()
{
    IndexModel indexModel = new IndexModel(_optionsAccessorWithDelegateConfig);
    indexModel.OnGet();
    return View();
}

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

4.子选项配置

将选项绑定到配置时,选项类型中的每个属性都将绑定到窗体property[:sub-property:]的配置键。例如,MyOptions.Option1属性将绑定到从appsettings.json中的option1属性读取的键Option1。在以下代码中,已向服务容器添加IConfigureOptions<TOptions>服务。它将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<MySubOptions>(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<TOptions>使用构造函数依赖关系注入来访问设置(Pages/Index.cshtml.cs):

public class IndexModel
{
    private readonly MySubOptions _subOptions;
    public IndexModel(IOptionsMonitor<MySubOptions> 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<MySubOptions> subOptionsAccessor)
{
    _subOptionsAccessor = subOptionsAccessor;
}
private readonly IOptionsMonitor<MySubOptions> _subOptionsAccessor;
public IActionResult Index()
{
    IndexModel indexModel = new IndexModel(_subOptionsAccessor);
    indexModel.OnGet();
    return View();
}

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

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

public class IndexModel
{
    private readonly MyOptions _snapshotOptions;
    public IndexModel(IOptionsSnapshot<MyOptions> 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<TOptions>.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<MyOptions>("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<MyOptions>("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<MyOptions> 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<MyOptions> namedOptionsAccessor)
{
    _namedOptionsAccessor = namedOptionsAccessor;
}
private readonly IOptionsSnapshot<MyOptions> _namedOptionsAccessor;
public IActionResult Index()
{
    IndexModel indexModel = new IndexModel(_namedOptionsAccessor);
    indexModel.OnGet();
    return View();
}

使用ConfigureAll方法配置所有选项

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

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: ASP.NETCore中的Options选项模式

本文链接: https://lsjlt.com/news/145221.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • ASP.NETCore中的Options选项模式
    1.前言 选项(Options)模式是对配置(Configuration)的功能的延伸。在12章(ASP.NET Core中的配置二)Configuration中有介绍过该功能(绑定...
    99+
    2024-04-02
  • ASP.NET Core中的Options选项模式怎么配置
    这篇文章主要介绍“ASP.NET Core中的Options选项模式怎么配置”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ASP.NET Core中的Options选项模式怎么配...
    99+
    2023-06-29
  • GO 函数式选项模式(Functional Options Pattern)
    Golang 开发者遇到的许多问题之一是尝试将一个函数的参数设置为可选. 这是一个非常常见的用例, 有些对象应该使用一些基本的默认设置来开箱即用, 并且你偶尔可能需要提供一些更详细的...
    99+
    2024-04-02
  • 详解Golang函数式选项(Functional Options)模式
    概览 最近阅读源码的时候看到一段不错的代码,但是当时却不是非常理解为什么这么写。 我们先来看一下源代码: type User struct { ID string N...
    99+
    2024-04-02
  • Vue中的options选项怎么用
    这篇文章主要介绍了Vue中的options选项怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue中的options选项怎么用文章都会有所收获,下面我们一起来看看吧。Vue中的options选项optio...
    99+
    2023-06-29
  • 详细聊聊Vue中的options选项
    目录Vue中的options选项options的五类属性入门属性使用vue文件添加组件computed(计算属性)用途缓存示例:watch(监听)用途何为变化deep: true是干...
    99+
    2024-04-02
  • vue的options选项是什么
    本教程操作环境:windows7系统、vue3版,DELL G3电脑。Vue中options的作用options是什么options 顾名思义就是“选项”的意思, 或称为构造选项. 是在创建Vue实例时传入的参数, 是一个对象.const ...
    99+
    2023-05-14
    Vue
  • .Net Core 中选项Options的具体实现
    目录由代码开始定义一个用户配置选项定义json配置文件:myconfig.json创建ServiceCollection示例代码代码运行结果通过运行代码得到的结论问题配合源码解决疑惑...
    99+
    2024-04-02
  • vue的options选项有什么作用
    这篇文章主要讲解了“vue的options选项有什么作用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue的options选项有什么作用”吧!在vue中,options选项是指“构造选项”...
    99+
    2023-07-04
  • 详解ASP.NET Core3.0 配置的Options模式
    上一章讲到了配置的用法及内部处理机制,对于配置,ASP.NET Core还提供了一种Options模式。 一、Options的使用 上一章有个配置的绑定的例子,可以将配置绑定...
    99+
    2022-06-07
    options net ASP.NET core ASP
  • ts 类型体操 Chainable Options 可链式选项示例详解
    目录问题答案传参option部分get问题 在JavaScript我们通常会使用到可串联(Chainable/Pipline)的函数构造一个对象,但是在Typescript中,你能合...
    99+
    2024-04-02
  • 解析ASP.NET Core中Options模式的使用及其源码
    目录1、Options模式的用法2、Options模式源码解析3、最佳实践本章将和大家分享ASP.NET Core中Options模式的使用及其源码解析。 在ASP.NET Core...
    99+
    2024-04-02
  • Java+Selenium实现控制浏览器的启动选项Options
    目录简介Options选项设置浏览器后台运行设置浏览器最大化自定义浏览器大小加载用户配置隐藏指纹特征禁用浏览器正在被自动化程序控制的提示模拟移动设备添加代理设置chrome的下载路径...
    99+
    2023-01-11
    Java Selenium控制浏览器Options Java Selenium控制Options Java Selenium Options Java Selenium
  • Golang函数式选项模式怎么实现
    本篇内容主要讲解“Golang函数式选项模式怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Golang函数式选项模式怎么实现”吧!概览最近阅读源码的时候看到一段不错的代码,但是当时却不是...
    99+
    2023-06-22
  • ASP.NETCore模仿中间件方式实现列表过滤功能
    我们的很多功能当中都会遇到对版本进行过滤的场合,例如你可能需要对列表中的数据的时间进行过滤、版本过滤、渠道以及地区信息进行过滤。 原本的做法:设计很多个过滤方法,通过枚举的方式组合,...
    99+
    2024-04-02
  • ASP.NETCore实现中间件的几种方式
    前言 ASP.NET Core 中 HTTP 管道使用中间件组合处理的方式, 换句人话来说, 对于写代码的人而言,一切皆中间件. 业务逻辑/数据访问/等等一切都需要以中间件的方式来呈...
    99+
    2024-04-02
  • 详解Java项目中的工厂模式
    详解Java项目中的工厂模式?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 简单工厂模式    当需要加法类的时候,调用工厂类的CreateOperate(),要指定制造的...
    99+
    2023-05-31
    工厂模式 java ava
  • 使用模型数组中的选项渲染 SelectTag()
    本篇文章给大家分享《使用模型数组中的选项渲染 SelectTag()》,覆盖了Golang的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有...
    99+
    2024-04-04
  • win7休眠模式选项不见了如何找回
    这篇文章主要介绍“win7休眠模式选项不见了如何找回”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“win7休眠模式选项不见了如何找回”文章能帮助大家解决问题。方法:我们依次打开控制面板→硬件和声音→...
    99+
    2023-06-28
  • 闭包在Golang项目中的设计模式
    闭包是一种将函数与其访问的变量环境绑定的技术。在 golang 中,它广泛用于设计模式,如:工厂模式:封装工厂方法和私有数据,用于创建特定类型对象。策略模式:封装策略方法和私有数据,用于...
    99+
    2024-04-16
    golang 设计模式
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作