abp vnext2.0核心组件之.Net Core默认DI组件切换到AutoFac源码解析
老版Abp对Castle的严重依赖在vnext中已经得到了解决,vnext中DI容器可以任意更换,为了实现这个功能,底层架构相较于老版abp,可以说是进行了高度重构.当然这得益于.Net Core的DI容器组件本身的优势.接着abp vnext2.0核心组件之模块加载组件源码解析 上文,上文中我跳过了DI切换这个流程,因为我觉得这是整个框架的亮点之一,所以单独写了这篇随笔.
.Net Core2.2之后,切换DI的实现换了,改成实现如下接口
1、核心ServiceProviderFactory接口实现
核心原理非常的简单,看看vnext如何实现这个工厂约束接口,并返回指定provider.
大致的逻辑是传入ServiceCollection,遍历ServiceCollection使用autofac的containerbuilder进行注入.最后调用containerbuilder实例的builder的build方法,返回provider.一气呵成,很简单.
接着,重点来了,看看Populate方法,看看其如何将ServiceCollection中的类型注入autofac容器的.
先将原生DI的相关功能转换成Autofac的,接着进行类型注册.
第一步获取模块加载类型中所有的模块,模块信息如下:
第二步释出DI容器中的ServiceRegistrationActionList,这个list非常重要.在DI默认容器转中的类型注入Autofac容器时,会遍历所有类型,并将类型的类型和实现生成上下文,传递给指定的action,实现代码如下:
看看vnext的示例代码如下:
简单的工作单元.
介绍了ServiceRegistrationActionList之后,接着看如下代码:
遍历所有的services集合,根据注入的方式和注入类型的差异进行区分,并注入到Autofac的ContainerBuilder中.代码很简单,挑个重点说下,如下:
红框中的第一行,代码如下:
如果当前类型所在的程序集属于应用程序集,不是与第三方程序集,则启动属性注入(反射的方式).
红框中的第二行就是上面介绍的遍历所有类型,生成上下文,并执行DI中注入的ServiceRegistrationActionList中的action,这里注意拦截器的注入,如下:
在执行完所有的Action之后,其中有部分Action,如下:
是向上下文中的拦截器集合追加拦截器的,所以当所有的action执行完毕之后,所有的拦截器也被写入到了拦截器集合中.下一步初始化拦截器。如下:
这边后续会写一篇随笔,专门介绍vnext中的拦截器的机制.涉及到另一个组件.本文就不介绍了.不是本文的重点.
顺便提一句
有能力的可以做一下这个todo.
ok,到这里所有的默认DI中的类型集合全部注入到了autofac中,并且完成了拦截器的初始化和应用程序框架的自动属性注入功能.
整个Populate方法执行完毕.AbpAutofacServiceProviderFactory的CreateBuilder方法也就结束了.最终将默认DI中的类型集合(IServiceCollection)转换成Autofac中的ContainerBuilder
接着看看CreateServiceProvider方法如下:
看看AutofacServiceProvider的构造,如下:
具体参考源码,实现了默认DI的获取Services接口。所以你可以继续用默认DI提供的方法,但是此时DI已被切换成了Autofac.
2、模块加载系统如何与之配合
接下去看看vnext的模块加载系统如何配合AbpAutofacServiceProviderFactory完成DI切换
第一步需要注入Autofac服务.
在注入核心的工厂服务后,且整个vnext框架的类型全部注入到默认DI中,那么需要触发核心工厂服务的相关方法如下:
继续观察ServiceCollectionCommonExtensions类下面的BuildServiceProviderFromFactory,如下
直接调用核心的工厂服务的CreateBuilder方法,这样所有默认DI中的类型全部注入到了autofac的容器中.并且切换默认DI容器到了autofac.替换默认DI的核心接口实现如下:
最后需要将模块加载系统中预先注入的ServiceProvider替换成核心的工厂服务的CreateBuilder方法执行后生成的ServiceProvider.
ok,整个DI切换流程到这里结束.abp团队的实现很简洁.如果你需要扩展其他的DI容器,可以参照他们的实现.
纯属个人理解,能力有限,有问题请指正!
abp vnext2.0核心组件之.Net Core默认DI组件切换到AutoFac源码解析相关推荐
- abp vnext2.0核心组件之DDD组件之实体结构源码解析
接着abp vnext2.0核心组件之模块加载组件源码解析和abp vnext2.0核心组件之.Net Core默认DI组件切换到AutoFac源码解析集合.Net Core3.1,基本环境已经完备, ...
- .Net Core 中间件之主机地址过滤(HostFiltering)源码解析
一.介绍 主机地址过滤中间件相当于一个白名单,标记哪些主机地址能访问接口. 二.使用 新建WebAPI项目,修改Startup中的代码段如下所示.下面表示允许主机名为"localhost&q ...
- 【详解】Ribbon 负载均衡服务调用原理及默认轮询负载均衡算法源码解析、手写
Ribbon 负载均衡服务调用 一.什么是 Ribbon 二.LB负载均衡(Load Balancer)是什么 1.Ribbon 本地负载均衡客户端 VS Nginx 服务端负载均衡的区别 2.LB负 ...
- abp vnext2.0之核心组件模块加载系统源码解析
abp vnext是abp官方在abp的基础之上构建的微服务架构,说实话,看完核心组件源码的时候,很兴奋,整个框架将组件化的细想运用的很好,真的超级解耦.老版整个框架依赖Castle的问题,vnext ...
- 未能加载文件或程序集rsy3_abp vnext2.0之核心组件模块加载系统源码解析
abp vnext是abp官方在abp的基础之上构建的微服务架构,说实话,看完核心组件源码的时候,很兴奋,整个框架将组件化的细想运用的很好,真的超级解耦.老版整个框架依赖Castle的问题,vnext ...
- .Net Core 认证系统之基于Identity Server4 Token的JwtToken认证源码解析
介绍JwtToken认证之前,必须要掌握.Net Core认证系统的核心原理,如果你还不了解,请参考.Net Core 认证组件源码解析,且必须对jwt有基本的了解,如果不知道,请百度.最重要的是你还 ...
- .net core 源码解析-mvc route的注册,激活,调用流程(三)
.net core mvc route的注册,激活,调用流程 mvc的入口是route,当前请求的url匹配到合适的route之后,mvc根据route所指定的controller和action激活c ...
- Vue2.0源码解析 - 知其然知其所以然之Vue.use
前言 小伙伴们大家好.用过Vue的小伙伴都知道,在我们进行Vue开发时,避免不了会使用一些第三方的库,比如说ElementUI组件库.当我们导入好这些组件库后会执行一个Vue.use函数,然后把导进来 ...
- .Net Core 源码解析
.Net core 源码解析 启动代码 创建并配置主机Builder CreateDefaultBuilder分析 Host类-用于产生初始的builder静态类 IHostBuilder转变成IWe ...
最新文章
- eclipse运行maven web项目
- xhell启动mysql_xshell怎么搭建mysql
- 统一对比学习框架?没错它来了。
- 【跃迁之路】【712天】程序员高效学习方法论探索系列(实验阶段469-2019.2.2)...
- Java并发编程之CAS和AQS
- 电容的q值计算公式_(生活小贴士)一分钟了解“三星贴片电容的结构与材料特性”...
- 论文学习: Journaling of Journal is (almost) Free 未整理
- openGL超级宝典第七版
- Thinkpad x230 win7/xp 双系统安装全过程
- html调整浏览器兼容性,浏览器兼容性问题整理
- 易智瑞大赛——地图故事组参赛经验
- 三国战纪2 ,西游2的FBA 移植攻略!
- 计算机网络结构示意图,常见的五种计算机网络拓扑结构分析
- 美国7月ISM制造业PMI录得52.8创两年多新低 新订单连续第二个月萎缩
- Android 使用PLDroidPlayer播放网络视频 依据视频角度自己主动旋转
- pwm一个时间单位_时间的换算单位是怎么换算的啊,秒,毫秒,微妙,纳秒等
- html制作图片动画效果代码,HTML5 Canvas:制作动画特效
- Java接口:实现防盗门功能
- VS2008 工程运行时候的一个R6034问题
- Cowboy 用户指南 (二) - Erlang and the Web
热门文章
- 【Maven实用技巧】03. Maven 编译打包时如何忽略测试用例
- SQL调优:带函数的谓词导致CBO Cardinality计算误差
- 设置单元格填充方式_单元格的选择及设置单元格格式
- 【跃迁之路】【599天】程序员高效学习方法论探索系列(实验阶段356-2018.09.27)...
- Android 编译时:m、mm、mmm、mma、mmma的区别
- SpringBoot获取ApplicationContext
- Python pip 国内镜像大全及使用办法
- 重要的ui组件——Behavior
- SSIS package 更新 variable
- 15个IT技术人员必须思考的问题