我們一直在與多租戶應用進行鬥爭。 這是一個ASP MVC EF6 Code First Web應用程序。ASP MVC EF6代碼優先多租戶得到租戶ID
我們初始化租戶的名單在Application_Start,讓一對值:
Host
TenantId
因此,我們可以用一個TenantId任何主機相關聯,並存儲在緩存列表。
我們已經配置了一個自定義過濾器來獲取當前租戶。
public class TenantActionFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.HttpContext.Items.Add("TenantId", GetCurrentTenant(filterContext.HttpContext.Request.Url.Host));
base.OnActionExecuting(filterContext);
}
}
GetCurrentTenant函數只是訪問緩存中的列表並根據傳遞的主機獲取當前的列表。
將當前租戶存儲在上下文中的項目中是否正確?
之後,我們創建了一個攔截器來獲取任何查詢並添加一個篩選器以便按TenantId進行篩選。這樣做並且工作良好,我們只需要從上下文中添加tenantId:
我們遇到的問題是我們在哪裏獲得每個請求的TenantId。
if (HttpContext.Current.CurrentHandler == null) return;
var clientId = Convert.ToInt32(HttpContext.Current.Items["ClientId"]);
foreach (DbParameter param in command.Parameters)
{
if (param.ParameterName != TenantAwareAttribute.TenantIdFilterParameterName)
continue;
param.Value = clientId;
}
我們不知道這是否是正確的方法,因爲網絡上有很多信息。
感謝。