首页 > 其他分享 >ABP vNext 自动入住暗藏玄机

ABP vNext 自动入住暗藏玄机

时间:2022-10-21 11:14:34浏览次数:44  
标签:vNext ABP ITransientDependency interfaceName IUserRepository 接口 暗藏玄机 自动 注入

导言

我们在使用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”之后看这个类是否是这个字符串结尾,如果是则注入,如果不是则不注入,并且将会递归他所有实现的接口,如果有多个接口都满足条件,则将会以这些接口进行注入。
还有一点就是实现了这三个自动依赖注入的接口的类型的,都将会以自身类型注入到容器


标签:vNext,ABP,ITransientDependency,interfaceName,IUserRepository,接口,暗藏玄机,自动,注入
From: https://www.cnblogs.com/liuxiaoji/p/16812775.html

相关文章

  • Abp FullAuditedAggregateRoot
    https://www.cnblogs.com/jackyfei/p/16193430.html这一次,我继承自FullAuditedAggregateRoot,相比Categoryd的AuditedAggregateRoot类,它还增加了IsDeleted、DeletionTime......
  • wabpack按需加载
    对于采用单页应用作为前端架构的网站来说,会面临着一个网页需要加载的代码量很大的问题,因为许多功能都集中的做到了一个HTML里。这会导致网页加载缓慢、交互卡顿,用户体验......
  • 【Q&A】Abp WebApi [FromBody] 简单类型渡劫Axios请求
    后端接口强制WebAPI从请求正文读取简单类型,添加[FromBody]属性到参数[HttpPost][Route("create")]publicTask<CalendarDto>CreateAsync([FromBody]......
  • 注意使用 ImageSharp 或其关联套件 NPOI、PdfSharpCore、ABP 等,现在要收费了
    注意是否使用ImageSharp套件,从2022-7-15开始要收费了,将影响许多工具,如使用NPOI、PdfSharpCore、ABP的用户也要收费。免费使用条件:您正在将作品用于在开源或可用......
  • ABP.VNET
    官网文档中心地址:https://docs.abp.io/zh-Hans/abp/latest/创建项目遇到的问题1.官网下载之后选择好数据库链接打开项目报错:Volo.Abp.AbpException:Couldnotfindth......
  • ABP V7使用-1
    从官方下载模板StartupTemplates-CreateaDemo|AspNetBoilerplate里面前后端,我的时V7.X+NET6+VUE版本的模板 1 打开后端,更换数据库连接,运行可能会报下面这......
  • abp remote
    最近有个项目在跨项目使用接口调用的时候,一直尝试都不通,整合了之前的方法A项目调用方vartemplate=await_hospitalPushSettingAppService.GetHospitalPushSettingByAc......
  • ABP-VNEXT 学习笔记(六)事件总线--本地事件总线2
    在上一篇中,我们学习介绍了Abp本地事件的基础应用,但都没有涉及到数据库层面的执行。在数据操作上,abp也提供了很好的事件处理机制,针对数据的增删改操作默认发布了事件,我们只......
  • ABP-VNEXT 学习笔记(六)事件总线--本地事件总线
    事件总线,是我们在处理分布式和微服务的时候经常需要用到的,用于分布式事务解决方案。事件总线基本就2个逻辑,1个发布事件,1个是订阅事件。abp也提供了事件总线的处理机制下......
  • 启动ABP项目异常 :could not instantiate Microsoft.AspNetCore.Mvc.RazorPages.Infra
    异常:  解决:本地ASP.NETCore运行时为6.0.2  将ASP.NETCore运行时更新到v6.0.3下载地址:https://dotnet.microsoft.com/zh-cn/download/dotnet/6.0 ......