[英]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;
}
但是我不知道如何正確地注冊它-如果我把斷點放在構造器中tenantProvider
為null
。
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
在構造函數中DbContext
與IHttpContextAccessor
-后者被注冊為單身。 但是acessor
參數仍然為null
。
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
我真的不明白您的AddScoped
調用應該做什么。 AddDbContext
將已經在服務集合中正確注冊數據庫上下文。 因此,當您通過依賴項注入解決上下文時,其他依賴項將被自動解決。
因此,這樣做應該足夠了:
services.AddDbContext<AppDbContext>(options => …);
services.AddSingleton<ITenantProvider, TenantProvider>();
然后,您可以使用構造函數注入(例如在控制器中)依賴於AppDbContext
。
但是有兩個注意事項:
配置選項時,應修改傳遞的選項對象。 因此,您不僅應該返回AppDbContextOptionsBuilder.Get()
還應該使用傳遞的options對象並對其進行編輯。
您應該真正考慮依賴於租戶提供者的數據庫上下文是否正確。 根據SRP ,您的數據庫只能做一件事情,那就是提供數據庫訪問權限。
根據承租方提供程序對數據庫訪問的影響,將這種依賴關系上移到某個使用數據庫上下文和承租方提供程序以正確方式查詢數據的服務中可能更有意義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.