gpt4 book ai didi

c# - Net core通用存储库模式如何在编译时不知道其类型的情况下注入(inject)DbContext?

转载 作者:行者123 更新时间:2023-12-02 09:39:12 25 4
gpt4 key购买 nike

我正在开发一个解耦的 Web api 项目,其业务逻辑在扩展中解耦(独立的项目,这为我在项目之间提供了大量共享代码),这就是为什么我正在开发一个也解耦的数据层,一切都在工作,但唯一让我将一切与其 AppDbContext.cs 结合起来的东西

这是一个 POC 代码,以便您了解我的想法(我的问题):

AppDbContext.cs

public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions<AppDbContext> dbContextOptions) : base(dbContextOptions)
{
}
}

IEntity.cs

public interface IEntity<TKey>
{
TKey Id { get; set; }
}

IRepository.cs

public interface IRepository<TEntity, TKey>
where TEntity : class, IEntity<TKey>
{
IEnumerable<TEntity> GetAll();
}

GenericRepository.cs

public class GenericRepository<TEntity, TKey> : IRepository<TEntity, TKey>
where TEntity : class, IEntity<TKey>
{
private readonly AppDbContext dbContext;

public GenericRepository(AppDbContext dbContext)
{
this.dbContext = dbContext;
}

public IEnumerable<TEntity> GetAll()
{
return dbContext.Set<TEntity>().ToList();
}
}

并将其注册到组合根中,如下所示:

services.AddScoped(typeof(IRepository<,>), typeof(GenericRepository<,>));

如您所见,我的通用存储库使用 AppDbContext,但是如果在名为 different 的不同项目中该怎么办?或继承自 IdentityContext,如何使我的通用存储库、DbContext 独立且在启动时可配置?

更新:

我忘了提及,在某些情况下,会有多个 DbContext 实现。

最佳答案

这里的最小公因数是DbContext

Rafactor GenericRepository 显式依赖于 DbContext

public class GenericRepository<TEntity, TKey> : IRepository<TEntity, TKey>
where TEntity : class, IEntity<TKey> {
private readonly DbContext dbContext;

public GenericRepository(DbContext dbContext) {
this.dbContext = dbContext;
}

public IEnumerable<TEntity> GetAll() {
return dbContext.Set<TEntity>().ToList();
}
}

在组合根,您将进行关联

services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(Configuration["database:connectionString"]));

services.AddScoped(typeof(IRepository<,>), typeof(GenericRepository<,>));
services.AddScoped<DbContext, AppDbContext>();
<小时/>

更新

如果有多个上下文,则需要更多的抽象。在这种情况下,我会为每个上下文创建一个特定的抽象。例如 IDbContextILoggingContext

public interface IDbContext : IDisposable {
int SaveContext();
DbSet<TEntity> Set<TEntity>();
//...other relevant EF members, etc
}

public interface IAppDbContext : IDbContext {

}

public interface ILogDbContext : IDbContext {

}

并让我的 DbContext 派生类继承与其相关的类。

public class AppDbContext : DbContext, IAppDbContext {
public AppDbContext(DbContextOptions<AppDbContext> dbContextOptions) : base(dbContextOptions) {
}
}

public class LogDbContext : DbContext, ILogDbContext {
public AppDbContext(DbContextOptions<LogDbContext> dbContextOptions) : base(dbContextOptions) {
}
}

从那里通用存储库将明确依赖于相关的抽象

public class GenericRepository<TEntity, TKey> : IRepository<TEntity, TKey>
where TEntity : class, IEntity<TKey> {
private readonly IDbContext dbContext;

public GenericRepository(IAppDbContext dbContext) {
this.dbContext = dbContext;
}

//...code removed for brevity
}

然后在组合根目录下进行必要的配置。

services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(Configuration["database:appConnectionString"]));

services.AddDbContext<LogDbContext>(options =>
options.UseSqlServer(Configuration["database:logConnectionString"]));

services.AddScoped(typeof(IRepository<,>), typeof(GenericRepository<,>));
services.AddScoped<IAppDbContext, AppDbContext>();
services.AddScoped<ILogDbContext, LogDbContext>();

关于c# - Net core通用存储库模式如何在编译时不知道其类型的情况下注入(inject)DbContext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48011706/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com