Asp.Net Core Options模式的知识总结
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模式的知识总结的更多相关文章
- ASP.NET Core 选项模式源码学习Options Configure(一)
前言 ASP.NET Core 后我们的配置变得更加轻量级了,在ASP.NET Core中,配置模型得到了显著的扩展和增强,应用程序配置可以存储在多环境变量配置中,appsettings.json用户 ...
- ASP.NET Core 2.2 基础知识(十八) 托管和部署 概述
为了方便演示,以 .NET Core 控制台应用程序讲解. 我们新建一个控制台应用程序,安装 "Newtonsoft.Json" Nuget 包,然后右键点击该项目,选择" ...
- ASP.NET Core 2.2 基础知识(十四) WebAPI Action返回类型(未完待续)
要啥自行车,直接看手表 //返回基元类型 public string Get() { return "hello world"; } //返回复杂类型 public Person ...
- ASP.NET Core 2.2 基础知识(十三) WebAPI 概述
我们先创建一个 WebAPI 项目,看看官方给的模板到底有哪些东西 官方给出的模板: [Route("api/[controller]")] [ApiController] pub ...
- ASP.NET Core 2.2 基础知识(十二) 发送 HTTP 请求
可以注册 IHttpClientFactory 并将其用于配置和创建应用中的 HttpClient 实例. 这能带来以下好处: 提供一个中心位置,用于命名和配置逻辑 HttpClient 实例. 例如 ...
- ASP.NET Core 2.2 基础知识(十一) ASP.NET Core 模块
ASP.NET Core 应用与进程内的 HTTP 服务器实现一起运行.该服务器实现侦听 HTTP 请求,并在一系列请求功能被写到 HttpContext 时,将这些请求展现到应用中. ASP.NET ...
- ASP.NET Core 2.2 基础知识(十) Web服务器 - Kestrel
ASP.NET Core 应用与进程内的 HTTP 服务器实现一起运行.该服务器实现侦听 HTTP 请求,并在一系列请求功能被写到 HttpContext 时,将这些请求展现到应用中. ASP.NET ...
- ASP.NET Core 2.2 基础知识(六) 配置(内含MySql+EF)
先上一段代码,了解一下 .NET Core 配置数据的结构. 新建一个 控制台项目,添加一个文件 json.json ,文件内容如下: { "country": "cn& ...
- ASP.NET Core 2.2 基础知识(四) URL重写中间件
说到URL重写就不得不提URL重定向. URL重定向 URL重定向是客户端操作,指示客户端访问另一个地址的资源.这需要往返服务器,并且当客户端对资源发出请求时,返回客户端的重定向URL会出现在浏览器的 ...
随机推荐
- 聊聊OSM
聊聊OSM 做路网的同学一定对OSM并不陌生,OSM是一个由英国人Steve Coast创立的一个项目,这个项目的目标是创建一个内容自由,且能让所有人编辑的世界地图.类似于维基百科的概念.和它对标的是 ...
- 过程 sp_addextendedproperty, 对象无效。不允许有扩展属性,或对象不存在。
过程 sp_addextendedproperty, 对象无效.不允许有扩展属性,或对象不存在. 首先这个是创建数据表的SQL,有Power Designer创建模型,直接生成的创建SQL会出现的问题 ...
- 使用FsCheck编写Property-based测试
使用FsCheck编写Property-based的测试 在编写基于Property-based的单元测试一文中,我们介绍了什么是Property-based测试.同时我们也总结了Property-b ...
- 微信公众号开发C#系列-4、获取接口调用凭证
概述 获取接口调用凭证实质就是获取access_token.在微信接口开发中,许多服务的使用都离不开Access Token,Access Token相当于打开这些服务的钥匙,正常情况下会在7200秒 ...
- WebSocketSharp 的使用
Server 端示例代码: class Program { static void Main(string[] args) { var wssv = new WebSocketServer(" ...
- WPF ObservableCollection 异步调用问题
问题介绍 当ObservableCollection列表被UI线程占用时,如果在异步线程中调用ObservableCollection,会弹出以下异常: 问题分析 我们使用一个viewModel,在V ...
- C# 在PPT中绘制形状(shape)
概述 本篇文章将介绍C# 在PPT幻灯片中操作形状(shape)的方法.这里主要涉及常规形状,如箭头.矩形.圆形.三角形.多边形.不规则形状等.下面的示例中,可以通过绘制形状,并设置相应格式等.示例包 ...
- SpringEl表达式(转)
什么是SpringEL? Spring3中引入了Spring表达式语言—SpringEL,SpEL是一种强大,简洁的装配Bean的方式,他可以通过运行期间执行的表达式将值装配到我们的属性或构造函数当中 ...
- 如何将数据库中的值经过servlet传入到jsp页面,并且用EL表达式显示出值
方法一:通过id查询某一数据库表中具体的行,将值封装在相应的对象中,如下面的对象Notice servlet中 String noticeId=request.getParameter("n ...
- Yii2设计模式——Yii2中用到哪些设计模式?
"Yii2设计模式"包含了两个方面的内容:1.设计模式,2.Yii2框架. <设计模式>一书虽然以JAVA语言来表达设计模式的思想,但是设计模式远不限制于某一种特定的语 ...