ASP.NET核心Web应用程序和辅助服务的通用数据库访问存储库-管理上下文



我有一个应用程序,它对ASP.Net Core web应用程序和ASP.Net Core Worker服务后台任务具有通用数据库要求。我有一个标准的基于存储库模式的方法,每个实体都有一个类(标准CRUD操作(。

我的问题涉及到为两个应用程序管理数据库上下文注入到Repository类的最佳方法。这对于ASP.Net核心web应用程序来说很容易:每次需要Db上下文时,都需要基于构造函数的DI。但是,辅助服务需要为每个ExecuteAsync迭代获取一个新的Db上下文,并通过某种方式将其传递给每个存储库类。这是可行的,但有点混乱:

code

protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
using var scope = _serviceScopeFactory.CreateScope();
var dbContext = scope.ServiceProvider.GetRequiredService<MyDbContext>();

...
}
}

code

我感兴趣的是一个单一的Db数据访问点设计模式,它将管理两个应用程序,同时在需要时获得线程安全的Db上下文。

任何帮助都非常感谢

我提出了一个可行的每个实体的存储库模式实现,它适用于ASP.NET核心web应用程序和Worker Service。以下是执行此操作的代码:

public interface IApplianceRepository
{
Task UpdateApplianceDetailsAsync(Appliance appliance);
Task CreateApplianceAsync(Appliance appliance);
…
}
public class SqlApplianceRepository : IApplianceRepository
{ 
protected IDbContext _db;
public SqlApplianceRepository() {}
public SqlApplianceRepository(IDbContext db)
{
_db = db;
}
public virtual async Task CreateApplianceDetailsAsync(Appliance appliance)
{
…
}
public virtual async Task UpdateApplianceDetailsAsync(Appliance appliance)
{
…
}
…
}   
public class SqlApplianceRepositoryWorkerService : SqlApplianceRepository
{
public override async Task CreateApplianceAsync(Appliance appliance)
{
_db = DbContextFactory.GetCurrentDbContext();
await base.CreateApplianceAsync(appliance);
}
public override async Task UpdateApplianceDetailsAsync(Appliance appliance)
{
_db = DbContextFactory.GetCurrentDbContext();
await base.UpdateApplianceDetailsAsync(appliance);
}
…
}

SqlApplianceRepository和SqlApplianceRepositoryWorkerService都被配置为临时服务,并在需要时注入到各自的应用程序中。GetCurrentDbContext((获取为每个对ExecuteAsync((的Worker Service调用创建的Db上下文。

最新更新