我正在用ASP.NET Core 5開發一個Web API應用程式,目標是實作多租戶功能。每個租戶都將擁有自己的資料庫。
在這個應用程式中,我將有兩個DbContext:
。DBContextMaster- 這個背景關系資料將在appsettings.json中是靜態的。它將從Web API獲得提出請求的租戶的資訊,并獲得為該特定客戶存盤的資料庫的名稱DBContextTenant- 這個背景關系在appsettings中會有一個類似這樣的連接字串:"DynamicTenant": "資料源=server;初始目錄={dbName};集成安全=False。{dbName}必須被替換,以使正確的資料庫被使用。
我對如何做到這一點有些疑問,但我的想法是:
- 發送租戶資訊
- 將租戶代碼或一種APIKEY與請求一起發送 。
- 驗證租戶是否存在,然后替換
DynamicTenant連接字串(部署某種快取以避免連續的查詢檢查同一租戶是否存在)
由于我剛剛開始使用 ASP.NET Core,我想知道我如何以及在哪里可以動態加載租戶背景關系。
更新:
這段代碼顯然可以為我所用。
services.AddDbContext<DbContextTenant>((serviceProvider, dbContextBuilder) =>
{
var connectionStringPlaceHolder = Configuration.GetConnectionString("DynamicTenant");
var httpContextAccessor = serviceProvider.GetRequiredService<IHttpContextAccessor>()。
var dbName = httpContextAccessor.HttpContext.Request.Headers["tenantId"].First()。
var connectionString = connectionStringPlaceHolder.Replace("{dbName}", dbName);
dbContextBuilder.UseSqlServer(connectionString);
});
但是現在我有另一個問題。當運行專案時沒有錯誤,但是當試圖使用這個dbcontext添加一個新的控制器時,出現了以下錯誤 "物件參考沒有設定為物件的實體"。當我試圖為該專案啟用遷移時,也出現了同樣的錯誤。
我假設錯誤的發生是因為在開發時沒有http背景關系。
可以通過什么實作來解決這些問題呢?
uj5u.com熱心網友回復:
發送租戶代碼或一種APIKEY與請求
你做得對。
從用戶那里獲得租戶的方法有很多,你可以使用頭資訊,你可以使用查詢字串,你可以使用主機(例如IP地址或域名)或所有行動的引數,例如一個API密鑰。
但是我建議你,使用主機或標頭,這樣你就可以為它添加一個中間件來監控所有的請求。
請看這個例子:
public class TenantMiddleware
{
private readonly RequestDelegate _next;
public TenantMiddleware (RequestDelegate next)
{
_next = next;
}
公共TenantMiddleware (RequestDelegate next)
{
_next = next;
}
公共異步任務 Invoke (HttpContext context)
{
context.Request.Headers.TryGetValue(_tenantKey, out StringValues host)。
var tenantHolder = context.RequestServices.GetRequiredService<ITenantHolder>()。
tenantHolder.SetTenant(_tenantKey)。
}
}
tenantHolder是一個范圍服務,它有每個請求的tenantId,你可以從中獲得資料。它只是有一個變數,給你的租戶,你也可以把它作為你的背景關系的工廠。
你可以在這個 repo 上找到更多細節。 TenantProvider
uj5u.com熱心網友回復:
在每個請求中發送租戶代碼是正確的
。如果你對請求只使用一個連接字串,并且你在Header上傳遞了neme,你可以這樣做:
services.AddDbContext<ContextDb>(options =>
{
var context = services.BuildServiceProvider().GetRequiredService<IHttpContextAccessor>().HttpContext;
//從HttpContext中獲取密鑰并創建你的連接字串
options.UseSqlServer(connectionString)
.LogTo(Console.WriteLine)
.EnableSensitiveDataLogging()。
},
ServiceLifetime.Scoped)。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/328658.html
標籤:
上一篇:從動態型別中獲取實際的模型型別
