繁体   English   中英

用于 ASP.NET 核心 Web 应用程序和工作器服务的公共数据库访问存储库 - 管理上下文

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM