ABP如何为Entity生成IRepository<TEntity>
How ABP generate IRepository<TEntity> for Entity
我正在尝试了解 ABP 如何执行上述操作。
ABP 中的正常工作流程是:
- 将实体 class 继承自基于实体 class 的实体添加到核心
项目
- 将 DbSet 添加到 EFCore 项目的上下文中
- 向 Application 项目添加一个新的 IEntityAppService 接口和实现
- 在 IEntityAppService 实现中,将 IRepository 注入构造函数
- 尽情享受!!
为了理解我做了什么:
我查看了 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()
}
您可能想要创建自定义存储库。查看文档:
您可以像这样替换应用程序的默认存储库:
[AutoRepositoryTypes(
typeof(IRepository<>),
typeof(IRepository<,>),
typeof(SimpleTaskSystemEfRepositoryBase<>),
typeof(SimpleTaskSystemEfRepositoryBase<,>)
)]
public class SimpleTaskSystemDbContext : AbpDbContext
{
...
}
我正在尝试了解 ABP 如何执行上述操作。
ABP 中的正常工作流程是:
- 将实体 class 继承自基于实体 class 的实体添加到核心 项目
- 将 DbSet 添加到 EFCore 项目的上下文中
- 向 Application 项目添加一个新的 IEntityAppService 接口和实现
- 在 IEntityAppService 实现中,将 IRepository 注入构造函数
- 尽情享受!!
为了理解我做了什么:
我查看了 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()
}
您可能想要创建自定义存储库。查看文档:
您可以像这样替换应用程序的默认存储库:
[AutoRepositoryTypes(
typeof(IRepository<>),
typeof(IRepository<,>),
typeof(SimpleTaskSystemEfRepositoryBase<>),
typeof(SimpleTaskSystemEfRepositoryBase<,>)
)]
public class SimpleTaskSystemDbContext : AbpDbContext
{
...
}