簡體   English   中英

使用多個參數注冊DbContext

[英]registering DbContext with multiple parameters

我正在嘗試將TenantProvider注入DbContext

public class AppDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, long>
{
    public int? _tenantId;

    public ITenantProvider _tenantProvider;

    public AppDbContext(
        DbContextOptions<AppDbContext> options,
        ITenantProvider tenantProvider
        )
    : base(options)
    {
        _tenantProvider = tenantProvider;
    }

但是我不知道如何正確地注冊它-如果我把斷點放在構造器中tenantProvidernull

Startup.cs的位

services.AddDbContext<AppDbContext>(options => AppDbContextOptionsBuilder.Get());

下一行需要將DbContext注入到控制器或服務中(如果我將ServiceLifetime.Scoped作為上述方法的第二個參數AddDbContext該功能無效):

services.AddScoped(p => new AppDbContext(AppDbContextOptionsBuilder.Get(), p.GetService<ITenantProvider>()));

(在我的解決方案中, Entity Framework是一個單獨的項目)


使用.AddScoped方法時-我們可以使用.GetService方法解析TenantProvider並將其傳遞給構造函數。

有誰知道如何在.AddDbContext方法中解析TenantProvider


附加信息:

我試圖取代ITenantProvider在構造函數中DbContextIHttpContextAccessor -后者被注冊為單身。 但是acessor參數仍然為null

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

我真的不明白您的AddScoped調用應該做什么。 AddDbContext將已經在服務集合中正確注冊數據庫上下文。 因此,當您通過依賴項注入解決上下文時,其他依賴項將被自動解決。

因此,這樣做應該足夠了:

services.AddDbContext<AppDbContext>(options => …);

services.AddSingleton<ITenantProvider, TenantProvider>();

然后,您可以使用構造函數注入(例如在控制器中)依賴於AppDbContext


但是有兩個注意事項:

  1. 配置選項時,應修改傳遞的選項對象。 因此,您不僅應該返回AppDbContextOptionsBuilder.Get()還應該使用傳遞的options對象並對其進行編輯。

  2. 您應該真正考慮依賴於租戶提供者的數據庫上下文是否正確。 根據SRP ,您的數據庫只能做一件事情,那就是提供數據庫訪問權限。

    根據承租方提供程序對數據庫訪問的影響,將這種依賴關系上移到某個使用數據庫上下文和承租方提供程序以正確方式查詢數據的服務中可能更有意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM