DependencyInjection源码解读之ServiceProvider
var services = new ServiceCollection();
var _serviceProvider = services.BuildServiceProvider();
serviceScope = _serviceProvider.GetRequiredService<IServiceScopeFactory>().CreateScope()
var internalServiceProvider = serviceScope.ServiceProvider;
internal ServiceProvider(IEnumerable<ServiceDescriptor> serviceDescriptors, ServiceProviderOptions options)
{
Root = this; if (options.ValidateScopes)
{
_callSiteValidator = new CallSiteValidator();
} _table = new ServiceTable(serviceDescriptors); _table.Add(typeof(IServiceProvider), new ServiceProviderService());
_table.Add(typeof(IServiceScopeFactory), new ServiceScopeService());
_table.Add(typeof(IEnumerable<>), new OpenIEnumerableService(_table));
}
internal ServiceProvider(ServiceProvider parent)
{
Root = parent.Root;
_table = parent._table;
_callSiteValidator = parent._callSiteValidator;
}
_table = new ServiceTable(serviceDescriptors);
//注入默认的依赖注入,这样才能在使用 _serviceProvider.GetRequiredService<IServiceScopeFactory>() 或在创建对象时为构造方法中的IServiceProvider 注入实例。
_table.Add(typeof(IServiceProvider), new ServiceProviderService());
_table.Add(typeof(IServiceScopeFactory), new ServiceScopeService());
_table.Add(typeof(IEnumerable<>), new OpenIEnumerableService(_table));
// BuildServiceProvider() 是扩展方法,有三个重载
//最终实现方法定义:this IServiceCollection services, ServiceProviderOptions options
//其中services是当前扩展的IServiceCollection,options是一些可选扩展选项
BuildServiceProvider() == new ServiceProvider(services, options); _serviceProvider.GetRequiredService<IServiceScopeFactory>();
//这一句获取一个ServiceScopeFactory实例,IServiceScopeFactory我们上面说过了,创建RootServiceProvider时内部注册的。 // CreateScope()
// CreateScope()是在IServiceScopeFactory接口内定义,ServiceScopeFactory类的实现为:
//return new ServiceScope(new ServiceProvider(_provider));
//其中_provider参数类型为ServiceProvider,是ServiceScopeFactory类的一个字段,其值来自构造方法注入
CreateScope() == new ServiceScope(new ServiceProvider(_provider));
DependencyInjection源码解读之ServiceProvider的更多相关文章
- swoft 源码解读【转】
官网: https://www.swoft.org/ 源码解读: http://naotu.baidu.com/file/814e81c9781b733e04218ac7a0494e2a?toke ...
- Lumen开发:lumen源码解读之初始化(4)——服务提供(ServiceProviders)与路由(Routes)
版权声明:本文为博主原创文章,未经博主允许不得转载. 前面讲了singleton和Middleware,现在来继续讲ServiceProviders和Routes,还是看起始文件bootstrap/a ...
- Abp 审计模块源码解读
Abp 审计模块源码解读 Abp 框架为我们自带了审计日志功能,审计日志可以方便地查看每次请求接口所耗的时间,能够帮助我们快速定位到某些性能有问题的接口.除此之外,审计日志信息还包含有每次调用接口时客 ...
- AspNetCore7.0源码解读之UseMiddleware
UseMiddlewareExtensions 前言 本文编写时源码参考github仓库主分支. aspnetcore提供了Use方法供开发者自定义中间件,该方法接收一个委托对象,该委托接收一个R ...
- SDWebImage源码解读之SDWebImageDownloaderOperation
第七篇 前言 本篇文章主要讲解下载操作的相关知识,SDWebImageDownloaderOperation的主要任务是把一张图片从服务器下载到内存中.下载数据并不难,如何对下载这一系列的任务进行设计 ...
- SDWebImage源码解读 之 NSData+ImageContentType
第一篇 前言 从今天开始,我将开启一段源码解读的旅途了.在这里先暂时不透露具体解读的源码到底是哪些?因为也可能随着解读的进行会更改计划.但能够肯定的是,这一系列之中肯定会有Swift版本的代码. 说说 ...
- SDWebImage源码解读 之 UIImage+GIF
第二篇 前言 本篇是和GIF相关的一个UIImage的分类.主要提供了三个方法: + (UIImage *)sd_animatedGIFNamed:(NSString *)name ----- 根据名 ...
- SDWebImage源码解读 之 SDWebImageCompat
第三篇 前言 本篇主要解读SDWebImage的配置文件.正如compat的定义,该配置文件主要是兼容Apple的其他设备.也许我们真实的开发平台只有一个,但考虑各个平台的兼容性,对于框架有着很重要的 ...
- SDWebImage源码解读_之SDWebImageDecoder
第四篇 前言 首先,我们要弄明白一个问题? 为什么要对UIImage进行解码呢?难道不能直接使用吗? 其实不解码也是可以使用的,假如说我们通过imageNamed:来加载image,系统默认会在主线程 ...
随机推荐
- WEB项目挂载到IIS session过期
莫名丢失问题: 1.可能是因为系统内部连续的抛出了5次以上的异常 导致进程重启(当前所有在线用户) 2.IIS6 以上默认配置进程,session存在进程内其实是在W3wp.exe中这个进程不稳定,在 ...
- JS截取数字
Math是javascript的一个内部对象,该对象的方法主要是一些数学计算方法floor:下退 Math.floor(12.9999) = 12ceil:上进 Math.ceil(12.1) = 1 ...
- 【开源】SpringBoot&Netty实现仿微信网页版项目更新
阅读本文约“2.3分钟” 项目更新啦!V1.3.0 还记得那个聊天室的小项目吗? SpringBoot 加 Netty 实现聊天室 没错,这次已经完整进行了版本的替换,酥酥聊天室! 基于原项目的改动, ...
- 多线程(5)async&await
.net 4.0的Task已经让我们可以非常简单地使用多线程,并且可以有返回值,也可以支持线程的取消等操作,可谓已经很强大了.但.net 4.5为我们带来了async&await,使得实现多线 ...
- SD详解-销售过程
http://www.sapzh.com/html/Financial/SD/3113.html 7 销售过程 7.1销售执行 目的 作用与目的描述 步骤 操作过程/步骤描述 备 ...
- Shell基础命令(二)
查看Linux的发行版 cat /etc/redhat-release cat /etc/os-release 查看系统用户的id信息 id 用户名 id root id 创建系统用户的命令 user ...
- C# 使用NPOI出现超过最大字体数和单元格格式变成一样的解决
在使用NPOI写入Excel文件的时候出现“它已经超出最多允许的字体数”,查询资料发现是字体创建太多的原因,需要将常用字体创建好,传入CellStyle中.参考(http://www.cnblogs. ...
- 从.Net到Java学习第七篇——SpringBoot Redis 缓存穿透
从.Net到Java学习系列目录 场景描述:我们在项目中使用缓存通常都是先检查缓存中是否存在,如果存在直接返回缓存内容,如果不存在就直接查询数据库然后再缓存查询结果返回.这个时候如果我们查询的某一个数 ...
- c或c++利用scanf无限输入并进行简单操作如比大小等
#include <iostream> using namespace std; int main() { ; ) //scanf返回值为int类型表示成功输入的数据数量个数 { if(n ...
- windows下安装virtualenv并且配置指定环境
下面是在windows下通过virtualenv创建虚拟环境, 包括 : 1. 安装virtualenv(使用pip可直接安装) 2. 使用virtualenv创建指定版本的虚拟环境 3. 进入虚拟环 ...