老版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源码解析相关推荐

  1. abp vnext2.0核心组件之DDD组件之实体结构源码解析

    接着abp vnext2.0核心组件之模块加载组件源码解析和abp vnext2.0核心组件之.Net Core默认DI组件切换到AutoFac源码解析集合.Net Core3.1,基本环境已经完备, ...

  2. .Net Core 中间件之主机地址过滤(HostFiltering)源码解析

    一.介绍 主机地址过滤中间件相当于一个白名单,标记哪些主机地址能访问接口. 二.使用 新建WebAPI项目,修改Startup中的代码段如下所示.下面表示允许主机名为"localhost&q ...

  3. 【详解】Ribbon 负载均衡服务调用原理及默认轮询负载均衡算法源码解析、手写

    Ribbon 负载均衡服务调用 一.什么是 Ribbon 二.LB负载均衡(Load Balancer)是什么 1.Ribbon 本地负载均衡客户端 VS Nginx 服务端负载均衡的区别 2.LB负 ...

  4. abp vnext2.0之核心组件模块加载系统源码解析

    abp vnext是abp官方在abp的基础之上构建的微服务架构,说实话,看完核心组件源码的时候,很兴奋,整个框架将组件化的细想运用的很好,真的超级解耦.老版整个框架依赖Castle的问题,vnext ...

  5. 未能加载文件或程序集rsy3_abp vnext2.0之核心组件模块加载系统源码解析

    abp vnext是abp官方在abp的基础之上构建的微服务架构,说实话,看完核心组件源码的时候,很兴奋,整个框架将组件化的细想运用的很好,真的超级解耦.老版整个框架依赖Castle的问题,vnext ...

  6. .Net Core 认证系统之基于Identity Server4 Token的JwtToken认证源码解析

    介绍JwtToken认证之前,必须要掌握.Net Core认证系统的核心原理,如果你还不了解,请参考.Net Core 认证组件源码解析,且必须对jwt有基本的了解,如果不知道,请百度.最重要的是你还 ...

  7. .net core 源码解析-mvc route的注册,激活,调用流程(三)

    .net core mvc route的注册,激活,调用流程 mvc的入口是route,当前请求的url匹配到合适的route之后,mvc根据route所指定的controller和action激活c ...

  8. Vue2.0源码解析 - 知其然知其所以然之Vue.use

    前言 小伙伴们大家好.用过Vue的小伙伴都知道,在我们进行Vue开发时,避免不了会使用一些第三方的库,比如说ElementUI组件库.当我们导入好这些组件库后会执行一个Vue.use函数,然后把导进来 ...

  9. .Net Core 源码解析

    .Net core 源码解析 启动代码 创建并配置主机Builder CreateDefaultBuilder分析 Host类-用于产生初始的builder静态类 IHostBuilder转变成IWe ...

最新文章

  1. eclipse运行maven web项目
  2. xhell启动mysql_xshell怎么搭建mysql
  3. 统一对比学习框架?没错它来了。
  4. 【跃迁之路】【712天】程序员高效学习方法论探索系列(实验阶段469-2019.2.2)...
  5. Java并发编程之CAS和AQS
  6. 电容的q值计算公式_(生活小贴士)一分钟了解“三星贴片电容的结构与材料特性”...
  7. 论文学习: Journaling of Journal is (almost) Free 未整理
  8. openGL超级宝典第七版
  9. Thinkpad x230 win7/xp 双系统安装全过程
  10. html调整浏览器兼容性,浏览器兼容性问题整理
  11. 易智瑞大赛——地图故事组参赛经验
  12. 三国战纪2 ,西游2的FBA 移植攻略!
  13. 计算机网络结构示意图,常见的五种计算机网络拓扑结构分析
  14. 美国7月ISM制造业PMI录得52.8创两年多新低 新订单连续第二个月萎缩
  15. Android 使用PLDroidPlayer播放网络视频 依据视频角度自己主动旋转
  16. pwm一个时间单位_时间的换算单位是怎么换算的啊,秒,毫秒,微妙,纳秒等
  17. html制作图片动画效果代码,HTML5 Canvas:制作动画特效
  18. Java接口:实现防盗门功能
  19. VS2008 工程运行时候的一个R6034问题
  20. Cowboy 用户指南 (二) - Erlang and the Web

热门文章

  1. 【Maven实用技巧】03. Maven 编译打包时如何忽略测试用例
  2. SQL调优:带函数的谓词导致CBO Cardinality计算误差
  3. 设置单元格填充方式_单元格的选择及设置单元格格式
  4. 【跃迁之路】【599天】程序员高效学习方法论探索系列(实验阶段356-2018.09.27)...
  5. Android 编译时:m、mm、mmm、mma、mmma的区别
  6. SpringBoot获取ApplicationContext
  7. Python pip 国内镜像大全及使用办法
  8. 重要的ui组件——Behavior
  9. SSIS package 更新 variable
  10. 15个IT技术人员必须思考的问题