老版Abp对Castle的严重依赖在vnext中已经得到了解决,vnext中DI容器可以任意更换,为了实现这个功能,底层架构相较于老版abp,可以说是进行了高度重构.当然这得益于.Net Core的DI容器组件本身的优势.接着abp vnext2.0核心组件之模块加载组件源码解析上文,上文中我跳过了DI切换这个流程,因为我觉得这是整个框架的亮点之一,所以单独写了这篇随笔.

.Net Core2.2之后,切换DI的实现换了,改成实现如下接口

核心原理非常的简单,看看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.

接下去看看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核心组件之领域实体组件源码解析

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

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

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

  3. spring默认启动位置以及contextConfigLocation设置源码解析

    这几天在看spring的源码,涉及到spring启动位置的部分,下面就看看spring到底是从哪儿开始加载的.本文使用的是spring3.0M3 首先spring的加载会借助一个监听器ContextL ...

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

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

  5. 04、NetCore2.0下Web应用之Startup源码解析

    04.NetCore2.0Web应用之Startup源码解析   通过分析Asp.Net Core 2.0的Startup部分源码,来理解插件框架的运行机制,以及掌握Startup注册的最优姿势. - ...

  6. 【原创】backbone1.1.0源码解析之View

    作为MVC框架,M(odel)  V(iew)  C(ontroler)之间的联系是必不可少的,今天要说的就是View(视图) 通常我们在写逻辑代码也好或者是在ui组件也好,都需要跟dom打交道,我们 ...

  7. 【原创】backbone1.1.0源码解析之Collection

    晚上躺在床上,继续完成对Backbone.Collection的源码解析. 首先讲讲它用来干嘛? Backbone.Collection的实例表示一个集合,是很多model组成的,如果用model比喻 ...

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

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

  9. DataX 3.0 源码解析一

    源码解析 基本调用类分析 任务启动由python脚本新建进程进行任务执行,后续执行由Java进行,以下将对java部分进行分 其中的调用原理机制. Engine 首先入口类为com.alibaba.d ...

随机推荐

  1. 微服务实战——微服务架构选型SpringCloud / Dubbo / K8S比较(一)

    ## 说在前面 大概是三年前,因一些原因公司原项目最初为单体结构部署,所有业务模块都在一个项目里面,而后随着业务的不断膨胀以及模块之间的耦合,导致后面增加或修改一些简单业务时的成本都会变的极大.新入职 ...

  2. beta week 1/2 Scrum立会报告+燃尽图 01

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/9911 git地址:https://e.coding.net/Eustia ...

  3. 【题解】[HNOI2015]菜肴制作(贪心+topo序)

    [题解][HNOI2015]菜肴制作(贪心+topo序) 题意:请你构造一个排列\(p[i]\)使得对于数组\(arc[i]=p[i]\)的字典序最小,并且对于给定的有序数对\((u,v)\)保证你给 ...

  4. Windows服务器管理--批量管理工具

    iis7批量远程控制: 一款电脑远程监控的工具,IIS7远程桌面管理是一款专业的远程桌面连接软件,无需安装.操作简单方便.完美的界面设计.强大的监控功能.稳定的系统平台,满足了用户实现远程桌面连接的需 ...

  5. The Annual Summary Of 2019

    Time is flying, it arrives at the end of year again. This is my first year working in PinDuoDuo inc ...

  6. Go Web 编程之 模板(一)

    概述 模板引擎是 Web 编程中必不可少的一个组件.模板能分离逻辑和数据,使得逻辑简洁清晰,并且模板可复用.引用第二篇文章<程序结构>一文中的图示,我们可以看到模板引擎在 Web 程序结构 ...

  7. vnpy源码阅读学习(2):学习PyQt5

    PyQt5的学习 花费了一个下午把PyQt5大概的学习了下.找了一个教程 PyQt5教程 跟着挨着把上面的案例做了一遍,大概知道PyQt5是如何生成窗体,以及控件的.基本上做到如果有需求要实现,查查手 ...

  8. Java 集合的工具类Collections的常用方法

    Collections类 java.utils.Collections是集合工具类,用来对集合进行操作. Collections类的常用方法 这里介绍四个常用方法: addAll(Collection ...

  9. 微信小程序修改checkbox的样式

    修改前: 修改后: wxml代码: <checkbox class="checkbox" /> wxss代码: /* checkbox选中钱样式 */ checkbox ...

  10. OpenGL ES for Android

    经过半年的准备OpenGL ES for Android系列文章终于要和大家见面了,在这里定一个小目标-先吸引1000个粉丝,万一实现了呢.写关于OpenGL ES的文章开始是有一些犹豫的,因为Ope ...