前言

这几天闲来没事看看ABP vNext的文档和源码,关于关于依赖注入(属性注入)这块儿产生了兴趣。

我们都知道。Volo.ABP 依赖注入容器使用了第三方组件Autofac实现的。有三种注入方式,构造函数注入和方法注入和属性注入。

ABP的属性注入原则参考如下:

这时候我就开始疑惑了,因为我知道Autofac框架默认不开启隐式的属性注入,那么ABP具体是哪里配置属性注入的呢?

接下来就是漫长的阅读源代码过程了。

解析源代码

首先我是用的是abp vNext的6.0.3版本,以下只列出关键代码

A.  Autofac源码中属性注入的位置是在 AutowiringPropertyInjector 类的InjectProperties()方法下

此方法是通过Autofac开启的属性注入实现。 里面主要是通过反射读取当前类型对应的所有属性,判断当前属性是否能够进行注入。

  • 比如 static,数组类型,值类型 是不需要注入的
  • 从容器中IComponentContext中取得一个当前属性对应的实例
  • 然后在通过反射调用set方法赋值

B. 查看调用链发现是RegistrationBuilder类的PropertiesAutowired()方法调用了InjectProperties()方法。

以上代码都是Autofac的源代码。 接下来开始是ABP vNext的源码了。

C: 继续查看调用链发现在ABP vNext代码中的 AbpRegistrationBuilderExtensions类下EnablePropertyInjection()调用了IRegistrationBuilder的PropertiesAutowired()方法。

当前方法的作用如下

  • 检查实现类型所在的程序集是否包含任何 AbpModule 模块。
  • 如果实现类型所在的程序集包含任何 AbpModule 模块,则启用属性注入,即调用 PropertiesAutowired() 方法。
  • 最后返回修改后的注册构建器。

D: 继续查看调用链,发现在AbpRegistrationBuilderExtensions类的ConfigureAbpConventions方法开启了属性注入。

此方法是配置了ABP的一些约定,主要逻辑是:

  1. 首先,它从注册数据中获取服务类型和实现类型。
  2. 然后,它调用 EnablePropertyInjection 方法,根据特定条件启用属性注入。
  3. 接着,它调用 InvokeRegistrationActions 方法,执行注册操作列表中的注册动作,该动作通常包括自定义的服务注册逻辑。
  4. 最后返回修改后的注册构建器。

E: 继续查看调用链发现在AutofacRegistration类的Register方法调用了ConfigureAbpConventions()方法

Register方法的作用:根据 IServiceCollection 中的服务描述符将服务注册到 Autofac 容器构建器中,并根据 Abp 的约定进行一些配置。Autofac 是一个 .NET 的依赖注入容器,它允许开发者注册和解析各种类型的服务。

F: 同样在当前类下的Populate方法调用了Register方法

当前方法主要是将服务集合中的服务注册到 Autofac 容器构建器中,并进行一些必要的配置,以确保服务能够被正确地解析和管理。

G: 接下来是到了AbpAutofacServiceProviderFactory类,当前类的CreateBuilder方法调用了Populate方法。

H: 到了当前这一步,就会发现AbpAutofacServiceProviderFactory类继承了IServiceProviderFactory,当前类的作用就是用于定义 DI容器的提供程序。

其中CreateBuilder方法会在 WebApplication类在Builder时候自动运行,属于微软框架的逻辑了。

至此就搞明白了ABP vNext框架是如何实现了属性注入了。

 参考链接

  1. ABP Dependency Injection
  2. Autofac Property Injection

解析 ABP vNext 依赖注入实现【属性注入】的原理的更多相关文章

  1. ASP.NET Core 依赖注入(构造函数注入,属性注入等)

    原文:ASP.NET Core 依赖注入(构造函数注入,属性注入等) 如果你不熟悉ASP.NET Core依赖注入,先阅读文章: 在ASP.NET Core中使用依赖注入   构造函数注入 构造函数注 ...

  2. IOC 构造函数注入vs属性注入

    1.不管是构造函数注入还是属性注入,都要先把对象给new 出来,构造函数应该也是public.2.一般使用 配置文件,属性注入,不用使用特性,直接配置,初始化或依赖,凡是注入的,都要有访问权限,pub ...

  3. ABP vNext系列文章03---依赖注入

    一.依赖注入的类型注册 ABP的依赖注入系统是基于Microsoft的依赖注入扩展库(Microsoft.Extensions.DependencyInjection nuget包)开发的.因此,它的 ...

  4. .net core番外第2篇:Autofac的3种依赖注入方式(构造函数注入、属性注入和方法注入),以及在过滤器里面实现依赖注入

    本篇文章接前一篇,建议可以先看前篇文章,再看本文,会有更好的效果. 前一篇跳转链接:https://www.cnblogs.com/weskynet/p/15046999.html 正文: Autof ...

  5. 源码解析-Abp vNext丨LocalEventBus

    前言 基础篇已经更新完了,从本篇开始我们进入,中级篇(学习部分源代码)我会挑一些我个人认为比较重要的知识点结合部分开源项目进行源码讲解,咱们废话不说直接上车. Abp vNext的事件总线分2种,一种 ...

  6. JAVA Spring JavaBean 属性值的注入方式( 属性注入, 特殊字符注入 <![CDATA[ 带有特殊字符的值 ]]> , 构造器注入 )

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  7. 源码解析-Abp vNext丨分布式事件总线DistributedEventBus

    前言 上一节咱们讲了LocalEventBus,本节来讲本地事件总线(DistributedEventBus),采用的RabbitMQ进行实现. Volo.Abp.EventBus.RabbitMQ模 ...

  8. ABP框架 - 依赖注入

    文档目录 本节内容: 什么是依赖注入 传统方式的问题 解决方案 构造器注入模式 属性注入模式 依赖注入框架 ABP 依赖注入基础 注册依赖 约定注入 辅助接口 自定义/直接 注册 使用IocManag ...

  9. (译)ABP之依赖注入

    原文地址:https://aspnetboilerplate.com/Pages/Documents/Dependency-Injection 什么是依赖注入 传统方式的问题 解决方案 构造函数注入 ...

  10. 依赖注入Bean属性

    一.Bean属性依赖注入 对于类成员变量,注入方式有三种 •构造函数注入 •属性setter方法注入 •接口注入 Spring支持前两种 1.构造函数 属性注入 使用构造方法注入,在Spring配置文 ...

随机推荐

  1. #NTT,原根#洛谷 3321 JZOJ 4051 [SDOI2015]序列统计

    题目 分析 首先朴素dp方程 设\(dp[i][j]\)表示\(i\)个数的数列乘积为\(j\)的方案 那么\(dp[i][j*a[k]\bmod m]=itself+dp[i-1][j]\) 这可以 ...

  2. DOM 节点遍历:掌握遍历 XML文档结构和内容的技巧

    遍历是指通过或遍历节点树 遍历节点树 通常,您想要循环一个 XML 文档,例如:当您想要提取每个元素的值时. 这被称为"遍历节点树". 下面的示例循环遍历所有 <book&g ...

  3. C++ 智能指针和内存管理:使用指南和技巧

    C++是一门强大的编程语言,但是在内存管理方面却存在着一些问题.手动管理内存不仅费时费力,而且容易出错.因此,C++中引入了智能指针这一概念,以更好地管理内存. 什么是智能指针? 在C++中,内存的分 ...

  4. 动态库 DLL 封装五:dll中弹出一个dialog窗口

    操作步骤: 1.在dll项目中,点击 资源,新建一个 dialog 2.cpp文件 CDialog dlg(IDD_STA); // 显示窗口 dlg.Create(IDD_STA, 0); dlg. ...

  5. mysql统计查询和索引练习

    课程数据表course SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table ...

  6. 报表输入页码翻页(润乾 V2018)

    报表数据分了太多页,一页一页翻页查看数据嫌麻烦,可以试试这种翻页效果--输入页码翻页. 润乾报表提供了翻页相关的 JS 函数,可以在报表展现的页面中添加 JS 调用翻页函数实现输入页码跳转到对应页. ...

  7. mysql 简单进阶 ———— 多列索引[一]

    前文 整理一下mysql 的一些简单进阶技巧,来源于高性能mysql,但不是根据书的序列来的. 正文 库地址: https://dev.mysql.com/doc/index-other.html 有 ...

  8. Jedis连接踩坑日记

    Jedis连接踩坑日记 背景: 线上某块业务的增删改功能全部都不可用.页面发送了xhr请求之后 状态一直处于pending状态,后端没有日志产生 排查路线与解决办法 第一:由于服务在内网里面,无法进行 ...

  9. 密码学中的RSA算法与椭圆曲线算法

    PrimiHub一款由密码学专家团队打造的开源隐私计算平台,专注于分享数据安全.密码学.联邦学习.同态加密等隐私计算领域的技术和内容. 在数字安全领域,加密算法扮演着至关重要的角色.它们确保了信息的机 ...

  10. 实用的SpringBoot生成License方案

    前言 License指的是版权许可证,当我们开发完系统后,如果不想让用户一直白嫖使用,比如说按时间续费,License的作用就有了. 我们可以给系统指定License的有效期,控制系统的可用时间. 那 ...