簡體   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