ABP vNext 自动注入,暗藏天坑如斯
導(dǎo)言
我們?cè)谑褂肁BP vNext框架時(shí),都知道該框架為我們實(shí)現(xiàn)了自動(dòng)依賴注入(實(shí)現(xiàn)自動(dòng)注入需要在項(xiàng)目里面創(chuàng)建Module類,并且將Module類上的DependsOn到相應(yīng)的啟動(dòng)Module類或調(diào)用Module類,這步很關(guān)鍵)
自動(dòng)注入示例
只要我們實(shí)現(xiàn)如下接口:
ITransientDependency 瞬時(shí)生命周期
ISingletonDependency 全局單例生命周期
IScopedDependency 作用域生命周期
天坑如斯
下面講一下巨坑,那就是在自動(dòng)注入的時(shí)候系統(tǒng)會(huì)自動(dòng)推斷要注入的接口,并且是你實(shí)現(xiàn)的所有的接口他都會(huì)注入也不是放在第一個(gè)實(shí)現(xiàn)的接口才會(huì)注入,而是根據(jù)接口的名字來判斷的,比如下面的類就會(huì)以接口IUserRepository注入:
public class UserRepository: IUserRepository, ITransientDependency { }同理下面的類型也會(huì)以接口IUserRepository注入:
public class EfCoreUserRepository: IUserRepository, ITransientDependency { }但是下面這種情況就不能了
public class UserEfCoreRepository: IUserRepository, ITransientDependency { }源碼
Volo.Abp.DependencyInjection.ExposeServicesAttribute.cs
private static List<Type> GetDefaultServices(Type type) {var serviceTypes = new List<Type>();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; }結(jié)論
能看出,推斷方法是去掉接口名的“I”之后看這個(gè)類名是否是這個(gè)字符串結(jié)尾,如果是則注入,如果不是則不注入,并且將會(huì)遞歸他所有實(shí)現(xiàn)的接口,如果有多個(gè)接口都滿足條件,則將會(huì)以這些接口進(jìn)行注入。
還有一點(diǎn)就是實(shí)現(xiàn)了這三個(gè)自動(dòng)依賴注入的接口的類型的,都將會(huì)以自身類型注入到容器
總結(jié)
以上是生活随笔為你收集整理的ABP vNext 自动注入,暗藏天坑如斯的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【日常排雷】 .Net core 生产环
- 下一篇: 【One by One系列】Identi