网站建设培训视频,商务网站建设教程,大学生网页设计主题,常州建设公司网站导言我们在使用ABP vNext框架时#xff0c;都知道该框架为我们实现了自动依赖注入(实现自动注入需要在项目里面创建Module类#xff0c;并且将Module类上的DependsOn到相应的启动Module类或调用Module类#xff0c;这步很关键)自动注入示例只要我们实现如下接口#xff1a;… 导言我们在使用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.csprivate static ListType GetDefaultServices(Type type)
{var serviceTypes new ListType();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”之后看这个类名是否是这个字符串结尾如果是则注入如果不是则不注入并且将会递归他所有实现的接口如果有多个接口都满足条件则将会以这些接口进行注入。还有一点就是实现了这三个自动依赖注入的接口的类型的都将会以自身类型注入到容器