Net6 DI源码分析Part1 ServiceCollection、ServiceDescriptor、ServiceLifetime、IServiceProvider
ServiceCollection、ServiceDescriptor、ServiceLifetime、IServiceProvider
Microsoft.Extensions.DependencyInjection.Abstractions
Microsoft.Extensions.DependencyInjection
基础使用方式
class Car : ICar { }
interface ICar { }
IServiceCollection services = new ServiceCollection();
ServiceDescriptor transientService = new ServiceDescriptor(typeof(ICar), typeof(Car), ServiceLifetime.Transient);
services.Add(transientService);
services.AddTransient<ICar, Car>();
var serviceProvider = services.BuildServiceProvider();
var car = serviceProvider.GetService(typeof(ICar));
IServiceCollection
存放服务注册的集合
ServiceCollection
它是对IServiceCollection接口的默认实现,
核心属性private readonly List<ServiceDescriptor> _descriptors = new List<ServiceDescriptor>();可以说是对List的一个包装类。
ServiceLifetime
用于描述服务声明周期的枚举 Singleton、Scoped、Transient
ServiceDescriptor
用于描述服务的注册信息
属性,后三个为提供的的服务实际类有关。
ServiceType服务类型Lifetime生命周期Type ImplementationTypeFunc<IServiceProvider,object> ImplementationFactoryobject ImplementationInstance
它还提供了一系列静态方法供用于创建ServiceDescriptor
- ServiceDescriptor.Transient
transientService = ServiceDescriptor.Transient(typeof(ICar), typeof(Car)); - ServiceDescriptor Describe
例如ServiceDescriptor.Transient
transientService = ServiceDescriptor.Describe(typeof(ICar), typeof(Car), ServiceLifetime.Transient);
多数情况下是使用
ServiceCollectionServiceExtensions为IServiceCollection扩展的一系列方法添加服务到IServiceCollection集合。
ServiceCollectionServiceExtensions
作为IServiceCollection提供了一系列添加服务注册信息到IServiceCollection集合集合内,内部基本都是创建对应的ServiceDescriptor然后调用IServiceCollection.Add方法添加到集合内。
IServiceProviderFactory
IServiceProvider的工厂接口默认实现为DefaultServiceProviderFactory
DefaultServiceProviderFactory
IServiceProvider的工厂类
构造函数
public DefaultServiceProviderFactory() : this(ServiceProviderOptions.Default)public DefaultServiceProviderFactory(ServiceProviderOptions options)
两个方法public IServiceCollection CreateBuilder(IServiceCollection services)public IServiceProvider CreateServiceProvider(IServiceCollection containerBuilder)它的内部CreateServiceProvider也是调用的ServiceCollectionContainerBuilderExtensions提供的扩展方法。
ServiceCollectionContainerBuilderExtensions
对IServiceCollection的扩展作用就是创建IServiceProvider例如提供了BuildServiceProvider
IServiceProvider
仅有的一个方法为用于获取服务。object? GetService(Type serviceType);ServiceProvider是它的默认实现ServiceProvider`
ServiceProviderOptions
ValidateScopes验证服务之前的Scopes依赖:例如 Singleton 服务依赖另一个Scoped服务,那么这个Scoped服务实例将被一个Singleton服务实例所引用,这时候此Scoped服务实例成了一个Singleton服务实例,如果设置为TrueServiceProvider的构造方法内会创建一个CallSiteValidator对象给自己的_callSiteValidator属性。 验证动作会在当Provider获取到CallSiteSerivce后对其进行验证。ValidateOnBuildIServiceProvider对象被构建的时候会检验提供的每个ServiceDescriptor 的有效性 例如注册的Car没有一个可以用的构造函数class Car : ICar { private Car() { } }的情况 。如果设置为True此时在buildServicePrivate时会抛出异常,否则需要等GetService时才会抛出异常。这是因为这个验证是在CallSiteFactory.GetCallSite动作里面做的,当设置为true是 也只是在ServiceProvider构造函数内调用了ValidateService方法该方法循环调用CallSiteFactory.GetCallSite(ServiceDescriptor serviceDescriptor, CallSiteChain callSiteChain),也就是说把,ServiceCallSite的创建动作提前。注意GetCallSite是个重载方法。具体区别会写在CallSiteFactory章节
Net6 DI源码分析Part1 ServiceCollection、ServiceDescriptor、ServiceLifetime、IServiceProvider的更多相关文章
- Net6 DI源码分析Part5 在Kestrel内Di Scope生命周期是如何根据请求走的?
Net6 DI源码分析Part5 在Kestrel内Di Scope生命周期是如何根据请求走的? 在asp.net core中的DI生命周期有一个Scoped是根据请求走的,也就是说在处理一次请求时, ...
- Net6 DI源码分析Part4 CallSiteFactory ServiceCallSite
Net6 CallSiteFactory ServiceCallSite, CallSiteChain abstract class ServiceCallSite ServiceCallSite是个 ...
- Net6 DI源码分析Part2 Engine,ServiceProvider
ServiceProvider ServiceProvider是对IServiceProvider实现,它有一个internal的访问修饰符描述的构造,并需要两个参数IServiceCollectio ...
- Net6 DI源码分析Part3 CallSiteRuntimeResolver,CallSiteVisitor
CallSiteRuntimeResolver CallSiteRuntimeResolver是实现了CallSiteVisitor之一. 提供的方法主要分三个部分 自有成员方法 Resolve提供服 ...
- Net6 Configuration & Options 源码分析 Part1
Net6 Configuration & Options 源码分析 Part1 在Net6中配置系统一共由两个部分组成Options 模型与配置系统.它们是两个完全独立的系统. 第一部分主要记 ...
- 小白都能看懂的 Spring 源码揭秘之依赖注入(DI)源码分析
目录 前言 依赖注入的入口方法 依赖注入流程分析 AbstractBeanFactory#getBean AbstractBeanFactory#doGetBean AbstractAutowireC ...
- Android事件分发机制源码分析
Android事件分发机制源码分析 Android事件分发机制源码分析 Part1事件来源以及传递顺序 Activity分发事件源码 PhoneWindow分发事件源码 小结 Part2ViewGro ...
- Net6 Configuration & Options 源码分析 Part2 Options
Net6 Configuration & Options 源码分析 Part2 Options 第二部分主要记录Options 模型 OptionsConfigurationServiceCo ...
- 一个由正则表达式引发的血案 vs2017使用rdlc实现批量打印 vs2017使用rdlc [asp.net core 源码分析] 01 - Session SignalR sql for xml path用法 MemCahe C# 操作Excel图形——绘制、读取、隐藏、删除图形 IOC,DIP,DI,IoC容器
1. 血案由来 近期我在为Lazada卖家中心做一个自助注册的项目,其中的shop name校验规则较为复杂,要求:1. 英文字母大小写2. 数字3. 越南文4. 一些特殊字符,如“&”,“- ...
随机推荐
- webservice websocket socket http rpc
HTTP: HTTP 是基于请求响应式的,即通信只能由客户端发起,服务端做出响应,无状态,无连接. webSocket: 服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向 ...
- vue 设置请求超时时间处理
Vue.http.post('http://114.214.164.77:2222/crptorgraphy',{msg:JSON.stringify(req)},{emulateJSON:true, ...
- InnoDB学习(七)之索引结构
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息.可以将数据库索引和书的目录进行类比,通过书的目录我们可以快速查找到章节位置,如果没有目录就只能一页页翻书查找 ...
- windows下的Python的下载与安装
Python的下载 Python下载要去官网下载,xdm,这里是网址 www.python.org 因为是外网所以打开下载会慢一些(不要着急的说) 这是python官网界面,跟着图片去下载(因为我这会 ...
- 2.spring系列之404异常的捕获
回顾 我在之前发布了一篇spring统一返回的文章,最后提到是无法捕获404异常的,这里我们先来测试一下 @RestController public class TestController { @ ...
- 论文翻译:2020_Acoustic Echo Cancellation Based on Recurrent Neural Network
论文地址:https://ieeexplore.ieee.org/abstract/document/9306224 基于RNN的回声消除 摘要 本文提出了一种基于深度学习的语音分离技术的回声消除方法 ...
- RSA非对称加密算法实现:Java
RSA是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院工作.RSA ...
- Python中单下划线与双下划线用法总结
看mentor的脚本时,遇到self._item.callspec.getparam('')语句,理解起来比较困难,找到一篇文章,记录的比较详细,特别记录一下,以备复习. 附链接地址:http://w ...
- 关于 this.$route.meta.operations.includes('delete') 取不到值的问题
原因是:src/mock/api/sys.login.js中定义的路径 要与src/router/modules/下定义的路由要一致 作用this.$route.matched可以查看匹配信息 来自为 ...
- 在使用jjwt时在配置文件中设置过期时间,取到的结果为0的原因
在设置了过期时间后感觉没有起作用,打印日志查看了下为0,因为生成token的文件在一个公共模块中,而过期时间设置在服务模块 中的配置文件中. 原因是:没有为设置getter和setter方法 来自为知 ...