博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ABP vNext 自动注入,暗藏天坑如斯
阅读量:4034 次
发布时间:2019-05-24

本文共 1365 字,大约阅读时间需要 4 分钟。

导言

我们在使用ABP vNext框架时,都知道该框架为我们实现了自动依赖注入(实现自动注入需要在项目里面创建Module类,并且将Module类上的DependsOn到相应的启动Module类或调用Module类,这步很关键)

自动注入示例

只要我们实现如下接口:

ITransientDependency 瞬时生命周期
ISingletonDependency 全局单例生命周期
IScopedDependency 作用域生命周期

public class Test : ITransientDependency{      //todo:....}

天坑如斯

下面讲一下巨坑,那就是在自动注入的时候系统会自动推断要注入的接口,并且是你实现的所有的接口他都会注入也不是放在第一个实现的接口才会注入,而是根据接口的名字来判断的,比如下面的类就会以接口IUserRepository注入:

public class UserRepository: IUserRepository, ITransientDependency{}

同理下面的类型也会以接口IUserRepository注入:

public class EfCoreUserRepository: IUserRepository, ITransientDependency{}

但是下面这种情况就不能了

public class UserEfCoreRepository: IUserRepository, ITransientDependency{}

源码

Volo.Abp.DependencyInjection.ExposeServicesAttribute.cs

private static List
GetDefaultServices(Type type){ var serviceTypes = new List
(); foreach (var interfaceType in type.GetTypeInfo().GetInterfaces()) { var interfaceName = interfaceType.Name; if (interfaceName.StartsWith("I")) { interfaceName = interfaceName.Right(interfaceName.Length - 1); } if (type.Name.EndsWith(interfaceName)) { serviceTypes.Add(interfaceType); } } return serviceTypes;}

结论

能看出,推断方法是去掉接口名的“I”之后看这个类名是否是这个字符串结尾,如果是则注入,如果不是则不注入,并且将会递归他所有实现的接口,如果有多个接口都满足条件,则将会以这些接口进行注入。

还有一点就是实现了这三个自动依赖注入的接口的类型的,都将会以自身类型注入到容器

转载地址:http://abudi.baihongyu.com/

你可能感兴趣的文章
SOA基础概念【整理中】
查看>>
Web Service概念(废)
查看>>
Tomcat,apache,web服务器,servlet,jsp
查看>>
Web Service概念整理(整理中)
查看>>
人类创造出来的世界——电子世界
查看>>
java可以递归多少次
查看>>
从头开始学习JSP(1)采用MyEclipse和Tomcat运行一个简单的.jsp程序
查看>>
从头开始学习jsp(2)——jsp的基本语法
查看>>
从头开始学习JSP(3)——一些配置
查看>>
html常用标签快速检索
查看>>
使用与或运算完成两个整数的相加
查看>>
备忘:java中的递归
查看>>
DIV/CSS:一个贴在左上角的标签
查看>>
CSS/DIV:不用float实现块状元素/block/的同行排列
查看>>
通过/proc/PID/status查看进程内存占用情况
查看>>
/proc文件系统读出来的数据是最新的吗?
查看>>
Solr及Spring-Data-Solr入门学习
查看>>
Vue组件
查看>>
python_time模块
查看>>
python_configparser(解析ini)
查看>>