Options模式是Asp.Net Core中用于配置的一种模式,它利用了系统的依赖注入,并且还可以利用配置系统。它使我们可以采用依赖注入的方法直接使用绑定的一个POCO对象,这个POCO对象就叫做Options对象。也可以叫做配置对象。

Options模式中的核心对象如下:

IOptions<TOptins>:非具名,它代表了系统中同一种类的POCO配置对象。在系统中是singleton,应用级别的注入。

IOptionsSnapshot<TOptions>:具名,它用名称代表了某一个具体的配置对象。从名字可以看出它能实时的捕获到配置对象的变化。在系统中是Scope,请求级别的注入。

IOptionsFactory<TOptions>:工厂,创建TOptions的工厂。在系统中是Transient。即用即弃。

IOptionsMonitorCache<TOptinos>:缓存,工厂创建的对象会被放到缓存中。在系统中是Singleton,应用级别的注入。

OptionsManager<TOptions>

这个类是IOptinos和IOptionsSnapshot这两个接口的默认实现。

这个类的构造函数需要传入IOptionsFactory<TOptions>。随后,还会在内部自创建一个实现了IOptinsMonitorCache的对象(OptionsCache)。OptionsManager本身是用来提供TOptions实例的,它内部又依赖IOptionsFactory这个工厂对象来创建对象。factory创建好的对象放到它内部的自创建的这个缓存上面。以独占的方式来对Toptions对象进行缓存。

原理上,IOptions表示的是不具名对象,IOptionsSnapshot接口表示的具名对象,但是在他们两个的实现OptionsManager中都是调用的同一个方法,只不过Ioptions提供了一个空字符串来表示不具名。在OptionsManager内部最终会调用Get方法来获取TOptions对象.

IOptinsFactory

默认的实现是OptionsFactory。接口有一个Create方法,接受一个string name参数,OptionsFactory提供Toptions对象总的来说有两个过程,TOptions的实例化和TOptinos的初始化。实例化的过程就是直接new 了一个TOptions对象,因为在接口约束里面对TOptions有new()约束,所以可以直接new出来这个对象,而初始化的过程是由三个接口来提供实现的,这三个接口分别是

①IConfigureOptions<in TOptions>

②IConfigureNamedOptions<in TOptins>:IConfigureOptions<TOptions> 注:它继承了IConfigureOptions接口。

③IPostConfigureOptions<in Toptions>

初始化的顺序为先执行①和②,再执行③。

这三个接口是在Service.Configure<TOptions>(this IServiceCollection services,string name,Action<Toptions> configureOptions) where TOptions:class这个扩展方法中进行配置的,最终,会调用services.AddSingleton<IConfigureOptions<Toptions>>(new ConfigureNamedOptions<Toptions>(name,configureOptions));这个方法,注册一个应用级别的服务。ConfigureNamedOptions实现了IConfigureOptions和IConfigureNamedOptions这两个接口。

Asp.Net Core Options模式的知识总结的更多相关文章

  1. ASP.NET Core 选项模式源码学习Options Configure(一)

    前言 ASP.NET Core 后我们的配置变得更加轻量级了,在ASP.NET Core中,配置模型得到了显著的扩展和增强,应用程序配置可以存储在多环境变量配置中,appsettings.json用户 ...

  2. ASP.NET Core 2.2 基础知识(十八) 托管和部署 概述

    为了方便演示,以 .NET Core 控制台应用程序讲解. 我们新建一个控制台应用程序,安装 "Newtonsoft.Json" Nuget 包,然后右键点击该项目,选择" ...

  3. ASP.NET Core 2.2 基础知识(十四) WebAPI Action返回类型(未完待续)

    要啥自行车,直接看手表 //返回基元类型 public string Get() { return "hello world"; } //返回复杂类型 public Person ...

  4. ASP.NET Core 2.2 基础知识(十三) WebAPI 概述

    我们先创建一个 WebAPI 项目,看看官方给的模板到底有哪些东西 官方给出的模板: [Route("api/[controller]")] [ApiController] pub ...

  5. ASP.NET Core 2.2 基础知识(十二) 发送 HTTP 请求

    可以注册 IHttpClientFactory 并将其用于配置和创建应用中的 HttpClient 实例. 这能带来以下好处: 提供一个中心位置,用于命名和配置逻辑 HttpClient 实例. 例如 ...

  6. ASP.NET Core 2.2 基础知识(十一) ASP.NET Core 模块

    ASP.NET Core 应用与进程内的 HTTP 服务器实现一起运行.该服务器实现侦听 HTTP 请求,并在一系列请求功能被写到 HttpContext 时,将这些请求展现到应用中. ASP.NET ...

  7. ASP.NET Core 2.2 基础知识(十) Web服务器 - Kestrel

    ASP.NET Core 应用与进程内的 HTTP 服务器实现一起运行.该服务器实现侦听 HTTP 请求,并在一系列请求功能被写到 HttpContext 时,将这些请求展现到应用中. ASP.NET ...

  8. ASP.NET Core 2.2 基础知识(六) 配置(内含MySql+EF)

    先上一段代码,了解一下 .NET Core 配置数据的结构. 新建一个 控制台项目,添加一个文件 json.json ,文件内容如下: { "country": "cn& ...

  9. ASP.NET Core 2.2 基础知识(四) URL重写中间件

    说到URL重写就不得不提URL重定向. URL重定向 URL重定向是客户端操作,指示客户端访问另一个地址的资源.这需要往返服务器,并且当客户端对资源发出请求时,返回客户端的重定向URL会出现在浏览器的 ...

随机推荐

  1. KeyboardUtil【软键盘弹出后输入框上移一定的高度】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 演示获取软键盘高度并保存,然后根据输入框的原有位置是否被软键盘挡住了,如果被挡住了则将整体页面上移一定的高度,当软键盘隐藏的时候再下 ...

  2. Java分布式锁,搞懂分布式锁实现看这篇文章就对了

    随着微处理机技术的发展,人们只需花几百美元就能买到一个CPU芯片,这个芯片每秒钟执行的指令比80年代最大的大型机的处理机每秒钟所执行的指令还多.如果你愿意付出两倍的价钱,将得到同样的CPU,但它却以更 ...

  3. 痞子衡嵌入式:恩智浦i.MXRT系列微控制器量产神器RT-Flash用户指南

    RT Flash English | 中文 1 软件概览 1.1 介绍 RT-Flash是一个专为基于NXP i.MX RT系列芯片的产品量产而设计的工具,其功能与官方MfgTool2工具类似,但是解 ...

  4. 玩转Spring Cloud之熔断降级(Hystrix)与监控

    本文内容导航目录: 前言:解释熔断降级一.搭建服务消费者项目,并集成 Hystrix环境 1.1.在POM XML中添加Hystrix依赖(spring-cloud-starter-netflix-h ...

  5. vue中用mock制造模拟接口(本文主要解决坑),一定要看完哦

    最近新入职一家公司,后端造接口速度很慢,想来想去还是搞一套模拟接口,来满足开发需求,有人会问,我造一个死数据不就可以了吗?或者说,后端数据结构都没出来,字段我怎么定? 问这个问题的人不奇怪,我之前也有 ...

  6. 使用 pm2 守护你的 .NET Core 应用程序

    一.守护进程的前世今生 守护进程,英文名:"daemon",也有守护神的意思.守护进程是一个在后台运行并且不受任何终端控制的进程,不会随着会话结束而退出.诸如 mysql.apac ...

  7. Vcomputer简介

    1.Vcompter存储程序式计算机虚拟机软件简介   Vcompter存储程序式计算机虚拟机软件的文件名为comp_alpha(一般要先安装java运行环境,然后双击该软件即可运行),该软件是桂林电 ...

  8. c# API接受图片文件以Base64格式上传图片

    /// base64上传图片 /// </summary> /// <returns>成功上传返回上传后的文件名</returns> [HttpPost] publ ...

  9. vue 项目中引用百度地图

    新建map.js export const BaiduMap = { init: function() { const BMapURL = 'https://api.map.baidu.com/api ...

  10. FreeNas搭建踩坑指南(三)

    0x00 Dell R730 无法编辑阵列卡Raid FreeNas和Windows Server都做成了uefi启动,装之前删掉了数据盘配置,系统装好后重启发现无法进入阵列卡编辑 0x01 解决方案 ...