ABP如何为Entity生成IRepository<TEntity>

How ABP generate IRepository<TEntity> for Entity

我正在尝试了解 ABP 如何执行上述操作。

ABP 中的正常工作流程是:

  1. 将实体 class 继承自基于实体 class 的实体添加到核心 项目
  2. 将 DbSet 添加到 EFCore 项目的上下文中
  3. 向 Application 项目添加一个新的 IEntityAppService 接口和实现
  4. 在 IEntityAppService 实现中,将 IRepository 注入构造函数
  5. 尽情享受!!

为了理解我做了什么:

  1. 我查看了 Abp 源代码,印象中这是由 Open Generics 在 IRepository<T>EfCoreRepositoryBase<T> 之间使用 Factory 魔法完成的。但是,我尝试在 AspNetCore DI 中执行此操作:

    public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        // adding DbContext
        // adding Mvc etc....
    
        // RepositoryBase => like EfCoreRepositoryBase in ABP
        // Error on this line, DI can not instantiate RepositoryBase as it is abstract
        services.AddTransient<IRepository<>, RepositoryBase<>);
    }
    

有人能给我解释一下这个机制吗?

神奇之处在于EfGenericRepositoryRegistrar.cs,其中:

foreach (var entityTypeInfo in _dbContextEntityFinder.GetEntityTypeInfos(dbContextType))
{
    // ...

    iocManager.IocContainer.Register(
        Component
            .For(genericRepositoryType)
            .ImplementedBy(implType)
            .Named(Guid.NewGuid().ToString("N"))
            .LifestyleTransient()
}

请注意 EfCoreRepositoryBaseOfTEntityAndTPrimaryKey.cs 不是抽象的。

您可能想要创建自定义存储库。查看文档:

Create custom repository

您可以像这样替换应用程序的默认存储库:

[AutoRepositoryTypes(
    typeof(IRepository<>),
    typeof(IRepository<,>),
    typeof(SimpleTaskSystemEfRepositoryBase<>),
    typeof(SimpleTaskSystemEfRepositoryBase<,>)
)]
public class SimpleTaskSystemDbContext : AbpDbContext
{
    ...
}