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. 一些特殊字符,如“&”,“- ...
随机推荐
- A Tutorial on Energy-Based Learning
目录 概 主要内容 损失函数 Energy Loss Generalized Perceptron Loss Generalized Margin Loss Hinge Loss Log Loss L ...
- 基于Spring MVC + Spring + MyBatis的【医院就诊挂号系统】
资源下载:https://download.csdn.net/download/weixin_44893902/21727306 一.语言和环境 1.实现语言: JAVA语言. 2.环境要求: MyE ...
- 使用 Android Studio 开发工具创建一个 Android 应用程序,显示一行文字“Hello Android”,并将应用程序的名称更改为“FirstApp”。
需求说明: 使用 Android Studio 开发工具创建一个 Android 应用程序,显示一行文字"Hello Android",并将应用程序的名称更改为"Firs ...
- Struts2中通过Ajax传递json数据
1.导入Struts2所需要的jar包 下载Struts2的jar包时,可以下载struts-2.5.13-min-lib.zip,然后放到项目的/WebContent/WEB-INF/lib路径下s ...
- 论文翻译:2020_Acoustic Echo Cancellation Based on Recurrent Neural Network
论文地址:https://ieeexplore.ieee.org/abstract/document/9306224 基于RNN的回声消除 摘要 本文提出了一种基于深度学习的语音分离技术的回声消除方法 ...
- websocket在线测试工具
为了测试websocket, 根据网上的一些工具修改了一些, 因此得到了这个工具 源码 源码: <!DOCTYPE html> <html lang="en"&g ...
- css基础-2 div布局
div布局 <html> <head> <title>div布局 </title> <meta charset="utf-8" ...
- 欢迎收看 Flink Forward Asia 2021 峰会直播
在线收看地址:https://developer.aliyun.com/special/ffa2021/live#?utm_content=g_1000316459 Flink 是由 Apache 软 ...
- centos7 配置JDK
// 查看是否有jdk rpm -qa | grep java 卸载掉系统自带的jdk(箭头标识),命令:rpm -e --nodeps 后面跟系统自带的jdk名 比如:rpm -e --node ...
- Linux如何对文件内容中的关键字进行查找
如果是用vi打开文件后,在命令行下输入"/关键字"如果是在没有打开文件的前提就用"cat 文件名 | grep "关键字"