• asp.net core选项配置的研究


    asp.net-core选项模块是全新,可拓展的框架,其作用在整个.net-core框架中,就像依赖注入一样无处不在,是一个很重要的组件。

    其实配置模块与选项模块是紧密相连的,我们可以使用ConfigureBuilder类来使用配置,但是在Startup类中,我们使用了依赖注入来实现IConfiguration接口(Startup类中的构造函数中使用依赖注入来实例化IConfiguration接口),通过这个接口对象来实现各种配置。但是配置不是我们主要讲的,这篇文章主要分析选项模块。
    要说选项就一定要了解IOptions<TOptions>接口,这个接口只要有个属性:

    public interface IOptions<out TOptions> where TOptions : class, new()
    {
    TOptions Value { get; }
    }

    在这里我们从两个示例来描述选项。第一个示例就是微软官网的选项示例。首先定义一个MyOptions类:

    public class MyOptions
    {
        public string Option1 { get; set; }
    
        public int Option2 { get; set; } = 5;
    
        public MyOptions()
        {
            Option1 = "value1 from ctor";
        }
    
    }

    依赖注入实例化MyOptions类:

    // 非派生自IOptions的类 DI注入(具体可以参考源码)
    services.Configure<MyOptions>(Configuration);

    接下来我们在Index.cshtml.cs文件:

    private readonly MyOptions _options;
    public string SimpleOptions{ get; private set;}

    然后在IndexModel的构造函数中注入(主要就是实现依赖注入):

    public IndexModel(IOptions<MyOptions> optionAccessor)
    {
        _options = optionAccessor.Value;
    }

    在OnGet()方法中:

    public void OnGet()
    {
        var option1 = _options.Option1;
        var option2 = _options.Option2;
        SimpleOptions = $"option1 = {option1}, option2 = {option2}";
    }

    接下来在就是Index.cshtml:

    @page
    @model IndexModel
    @using OptionsBeta.Models
    @{
    ViewData["Title"] = "Home page";
    }
    
    <h3>基本选项配置, 不派生自IOptions接口的实现</h3>
    @Model.SimpleOptions

    但是一般情况下我们都是继承自IOptions接口做我们自己的选项。那么应该怎么来做呢?代码如下:

    public class MyOptionsDelegate : IOptions<MyOptionsDelegate>
    {
        public MyOptionsDelegate()
        {
            Option1 = "value1 from ctor";
        }
    
        public string Option1 { get; set; }
        public int Option2 { get; set; } = 5;
    
        public MyOptionsDelegate Value
        {
            get { return this; }
        }
    }

    我们实现一个IOptions<TOptions>的类,接着我们基于IServiceCollection接口拓展一个方法:

    public static IServiceCollection AddOptionsByDelegate(this IServiceCollection services, Action<MyOptionsDelegate> setupAction)
    {
        services.Configure(setupAction);
        return services;
    }

    然后我们在ConfigurationServices方法中注入实例:

    // 拓展方法的方式实现
    services.AddOptionsByDelegate(myOptions =>
    {
        myOptions.Option1 = "rrrrrrrrrrrrrrrrrrrrrrrrrr";
        myOptions.Option2 = 280000;
    });

    接下来,Index.cshtml.cs文件:

    private readonly MyOptionsDelegate _optionsDelagate;
    public IndexModel(IOptions<MyOptions> optionAccessor, IOptions<MyOptionsDelegate> optionsDelegate)
    {
        _options = optionAccessor.Value;
        _optionsDelagate = optionsDelegate.Value;
    }
    public string SimpleOptionsByDelagate { get; private set; }

    在OnGet方法中:

    var optionsByDelegate3 = _optionsDelagate.Option1;
    var optionsByDelegate4 = _optionsDelagate.Option2;
    SimpleOptionsByDelagate = $"optionsByDelegate3 = {optionsByDelegate3}, optionsByDelegate4 = {optionsByDelegate4}";

    在Index.cshtml中:

    <h3>基于委托配置简单选项, 派生自IOptions接口的实现并使用了拓展方法的方式注入依赖</h3>
    @Model.SimpleOptionsByDelagate

    运行如下:

    demo代码: 链接:https://pan.baidu.com/s/1CqS8xRd_gzPxhke96mGITA 密码:28wn

  • 相关阅读:
    Nginx 模块开发(1)—— 一个稍稍能说明问题模块开发 Step By Step 过程
    nginx上传模块—nginx upload module-
    解决nginx上传模块nginx_upload_module传递GET参数
    nginx upload module的使用
    Nginx Upload Module 上传模块
    产品需求分析神器:KANO模型分析法
    SpringBoot @ConditionalOnBean、@ConditionalOnMissingBean注解源码分析与示例
    BAT、网易、京东等如何做大数据风控的?
    springboot 2.x 集成 drools 7.x
    Drools介绍与使用
  • 原文地址:https://www.cnblogs.com/zhiyong-ITNote/p/8969455.html
Copyright © 2020-2023  润新知