[英]Common DB Access repository for ASP.NET Core Web App and Worker Service - managing context
我有一个对 ASP.Net Core web 应用程序和一个 ASP.Net Core Worker 服务后台任务具有通用数据库要求的应用程序。 我有一个基于标准存储库模式的方法,每个实体都有一个 class(标准 CRUD 操作)。
我的问题涉及为两个应用程序管理 Db 上下文注入到存储库 class 的最佳方法。 这对于 ASP.Net Core web 应用程序来说很容易:每次需要 Db 上下文时,基于构造函数的 DI。 但是,worker 服务需要为每个 ExecuteAsync 迭代获取一个新的 Db 上下文,并通过某种方式将其传递给每个存储库 class。 这可行,但有点混乱:
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 都配置为临时服务,并在各自应用程序中需要的地方注入。 DbContextFactory.GetCurrentDbContext() 获取为每个对 ExecuteAsync() 的 Worker Service 调用创建的 Db 上下文。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.