【发布时间】:2016-12-09 12:28:19
【问题描述】:
我们一直在与多租户应用程序作斗争。 这是一个 ASP MVC EF6 Code First Web 应用程序。
我们在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;
}
我们不知道这是否是正确的方法,因为网上有很多信息。
谢谢。
【问题讨论】:
标签: entity-framework multi-tenant asp.net-mvc-custom-filter