ABP vNext 自動注入,暗藏天坑如斯

導言

我們在使用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<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;
}

結論

能看出,推斷方法是去掉接口名的“I”之後看這個類名是否是這個字符串結尾,如果是則注入,如果不是則不注入,並且將會遞歸他所有實現的接口,如果有多個接口都滿足條件,則將會以這些接口進行注入。
還有一點就是實現了這三個自動依賴注入的接口的類型的,都將會以自身類型注入到容器

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章