解析 ABP vNext 依赖注入实现【属性注入】的原理
前言这几天闲来没事看看ABP vNext的文档和源码,关于关于依赖注入(属性注入)这块儿产生了兴趣。
我们都知道。Volo.ABP 依赖注入容器使用了第三方组件Autofac实现的。有三种注入方式,构造函数注入和方法注入和属性注入。
ABP的属性注入原则参考如下:
https://img2024.cnblogs.com/blog/1015597/202405/1015597-20240509151318246-968137303.png
这时候我就开始疑惑了,由于我知道Autofac框架默认不开启隐式的属性注入,那么ABP具体是哪里配置属性注入的呢?
接下来就是漫长的阅读源代码过程了。
解析源代码
首先我是用的是abp vNext的6.0.3版本,以下只列出关键代码
A. Autofac源码中属性注入的位置是在 AutowiringPropertyInjector 类的InjectProperties()方法下
此方法是通过Autofac开启的属性注入实现。 里面主要是通过反射读取当前类型对应的所有属性,判断当前属性是否能够举行注入。
[*]比如 static,数组类型,值类型 是不必要注入的
[*]从容器中IComponentContext中取得一个当前属性对应的实例
[*] 然后在通过反射调用set方法赋值
https://img2024.cnblogs.com/blog/1015597/202405/1015597-20240509152300082-1927965009.png
https://img2024.cnblogs.com/blog/1015597/202405/1015597-20240509152911403-1027156827.png
https://img2024.cnblogs.com/blog/1015597/202405/1015597-20240509152945971-1356921630.png
B. 查看调用链发现是RegistrationBuilder类的PropertiesAutowired()方法调用了InjectProperties()方法。
https://img2024.cnblogs.com/blog/1015597/202405/1015597-20240509153120165-1481191748.png
以上代码都是Autofac的源代码。 接下来开始是ABP vNext的源码了。
C: 继续查看调用链发现在ABP vNext代码中的 AbpRegistrationBuilderExtensions类下EnablePropertyInjection()调用了IRegistrationBuilder的PropertiesAutowired()方法。
当前方法的作用如下
[*]检查实现类型地点的程序集是否包含任何 AbpModule 模块。
[*]如果实现类型地点的程序集包含任何 AbpModule 模块,则启用属性注入,即调用 PropertiesAutowired() 方法。
[*]最后返回修改后的注册构建器。
https://img2024.cnblogs.com/blog/1015597/202405/1015597-20240509153609577-913373212.png
D: 继续查看调用链,发现在AbpRegistrationBuilderExtensions类的ConfigureAbpConventions方法开启了属性注入。
此方法是配置了ABP的一些约定,主要逻辑是:
[*]首先,它从注册数据中获取服务类型和实现类型。
[*]然后,它调用 EnablePropertyInjection 方法,根据特定条件启用属性注入。
[*]接着,它调用 InvokeRegistrationActions 方法,执行注册操纵列表中的注册动作,该动作通常包罗自界说的服务注册逻辑。
[*]最后返回修改后的注册构建器。
https://img2024.cnblogs.com/blog/1015597/202405/1015597-20240509153825221-1404054121.png
E: 继续查看调用链发现在AutofacRegistration类的Register方法调用了ConfigureAbpConventions()方法
Register方法的作用:根据 IServiceCollection 中的服务形貌符将服务注册到 Autofac 容器构建器中,并根据 Abp 的约定举行一些配置。Autofac 是一个 .NET 的依赖注入容器,它允许开发者注册息争析各种类型的服务。
https://img2024.cnblogs.com/blog/1015597/202405/1015597-20240509154129536-1514512169.png
F: 同样在当前类下的Populate方法调用了Register方法
当前方法主要是将服务集合中的服务注册到 Autofac 容器构建器中,并举行一些必要的配置,以确保服务能够被精确地解析和管理。
https://img2024.cnblogs.com/blog/1015597/202405/1015597-20240509154409634-998591268.png
G: 接下来是到了AbpAutofacServiceProviderFactory类,当前类的CreateBuilder方法调用了Populate方法。
https://img2024.cnblogs.com/blog/1015597/202405/1015597-20240509154708333-1275985192.png
H: 到了当前这一步,就会发现AbpAutofacServiceProviderFactory类继承了IServiceProviderFactory,当前类的作用就是用于界说 DI容器的提供程序。
其中CreateBuilder方法会在 WebApplication类在Builder时候自动运行,属于微软框架的逻辑了。
https://img2024.cnblogs.com/blog/1015597/202405/1015597-20240509154900448-817273509.png
至此就搞明确了ABP vNext框架是怎样实现了属性注入了。
参考链接
[*]ABP Dependency Injection
[*]Autofac Property Injection
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]