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; } = ; 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; } = ; 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 = ;
});

接下来,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

asp.net core选项配置的研究的更多相关文章

  1. ASP.NET Core的配置(1):读取配置信息

    提到"配置"二字,我想绝大部分.NET开发人员脑海中会立马浮现出两个特殊文件的身影,那就是我们再熟悉不过的app.config和web.config,多年以来我们已经习惯了将结构化 ...

  2. ASP.NET Core Identity 配置 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core Identity 配置 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Identity 配置 上一章节我们简单介绍了下 Id ...

  3. ASP.NET Core的配置(5):配置的同步[设计篇]

    本节所谓的"配置同步"主要体现在两个方面:其一,如何监控配置源并在其变化的时候自动加载其数据,其目的是让应用中通过Configuration对象承载的配置与配置源的数据同步:其二. ...

  4. ASP.NET Core的配置(5):配置的同步[ 实例篇]

    ConfigurationBuilder在生成以Configuration对象的时候会利用注册其中的ConfigurationProvider加载原始的配置数据,那么一旦配置源中的数据发生变化,应用程 ...

  5. ASP.NET Core的配置(4):多样性的配置来源[下篇]

    我们在上篇和中篇对配置模型中默认提供的各种ConfigurationProvider进行了深入详尽的介绍,如果它们依然不能满足项目中的配置需求,我们可以还可以通过自定义ConfigurationPro ...

  6. ASP.NET Core的配置(4):多样性的配置来源[中篇]

    我们在本篇文章中会介绍三种针对物理文件的ConfiguationProvider,它们分别是针对JSON文件的JsonConfiguationProvider,针对XML文件的XmlConfiguat ...

  7. ASP.NET Core的配置(4):多样性的配置来源[上篇]

    较之传统通过App.config和Web.config这两个XML文件承载的配置系统,ASP.NET Core采用的这个全新的配置模型的最大一个优势就是针对多种不同配置源的支持.我们可以将内存变量.命 ...

  8. ASP.NET Core的配置(3): 将配置绑定为对象[下篇]

    我们在<读取配置信息>通过实例的形式演示了如何利用Options模型以依赖注入的方式直接获取由指定配置节绑定生成的Options对象,我们再次回顾一下当初我们编写的程序.如下面的代码片段所 ...

  9. ASP.NET Core的配置(3): 将配置绑定为对象[上篇]

    出于编程上的便利,我们通常不会直接利用ConfigurationBuilder创建的Configuration对象读取某个单一配置项的值,而是倾向于将一组相关的配置绑定为一个对象,我们将后者称为Opt ...

随机推荐

  1. 【Unity技巧】四元数(Quaternion)和旋转

    四元数介绍 旋转,应该是三种坐标变换--缩放.旋转和平移,中最复杂的一种了.大家应该都听过,有一种旋转的表示方法叫四元数.按照我们的习惯,我们更加熟悉的是另外两种旋转的表示方法--矩阵旋转和欧拉旋转. ...

  2. Android的ToggleButton和Switch以及AnalogColok和DigitalColok的用法-android学习之旅(二十)

    ToggleButton 和Switch简介 ToggleButton 和Switch都是继承了Button,所以他们的属性设置和Button差不多. 分别支持的属性 ToggleButton 的属性 ...

  3. 【一天一道LeetCode】#374. Guess Number Higher or Lower

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 We are ...

  4. [EXtJS5学习笔记]第一节 Sencha Cmd 学习笔记 简介 Sencha Cmd是什么

    本文地址: http://blog.csdn.net/sushengmiyan/article/details/38295575 本文作者:sushengmiyan ----------------- ...

  5. 【unix网络编程第三版】阅读笔记(四):TCP客户/服务器实例

    本篇博客主要记录一个完整的TCP客户/服务器实例的编写,以及从这个实例中引发的对僵死进程的处理等问题. 1. TCP客户/服务器功能需求 本实例完成以下功能: (1) 客户从标准输入读入一行文本,并写 ...

  6. Android 文件操作心得体会

    android 的文件操作说白了就是Java的文件操作的处理.所以如果对Java的io文件操作比较熟悉的话,android的文件操作就是小菜一碟了.好了,话不多说,开始今天的正题吧. 先从一个小项目入 ...

  7. 最近在线笔试的一些感想和总结,阿里巴巴,腾讯,百度,360。c++研发,机器学习等岗位

    持续更新中... 1.编程界牛人太多了,还是要好好a题,好好弄清楚基础算法,并且用代码实现 2.c/c++方向其实来回来去那么几道题,做好了记到脑子里. 下面就是我打算把不会的,不清楚的都贴上来然后好 ...

  8. 多重DES

    背景:单重DES在穷举攻击下相对比较脆弱 理论依据:以双重DES为例 加密:C = E(K2,E(K1,P))     解密:P = D(K1,D(K2,C)) 要证明多重加密有效,就要证明不存在K3 ...

  9. UNIX环境高级编程——文件和目录

    一.获取文件/目录的属性信息 int stat(const char *path, struct stat *buf); int fstat(int fd, struct stat *buf); in ...

  10. 软考之路--J2SE,从HelloWorld到传世代码

    "Hello World"程序指的是只在计算机屏幕上输出"Hello, World!"(意为"世界,你好!")这行字符串的计算机程序.hel ...