ABP如何为实体生成IRepository <tentity>

时间:2017-09-24 09:59:51

标签: c# dependency-injection aspnetboilerplate

我想了解ABP如何做到这一点。

ABP中的正常工作流程是:

  1. 将从基于实体的类继承的实体类添加到Core 项目
  2. 将DbSet添加到EFCore项目中的上下文
  3. 向Application project
  4. 添加新的IEntityAppService接口和实现
  5. 在IEntityAppService实现中,将IRepository注入构造函数
  6. 享受!!
  7. 我尝试理解的是:

    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<>);
      }
      
    2. 请有人向我解释这个机制吗?

2 个答案:

答案 0 :(得分:5)

魔法在jsfiddle,其中:

<div contenteditable="true">
    <p id="p1">
      <span id="s1">S</span><span id="s2">o</span><span id="s3">m</span><span id="s4">e</span><span id="s5">&nbsp;</span><span id="s6">t</span><span id="s7">e</span><span id="s8">x</span><span id="s9">t</span>
    </p>
</div>

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

答案 1 :(得分:0)

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

Create custom repository

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

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