[英]Can I handle different multi-tenancy with a global filter?
我有一个实现成员身份的asp.net mvc应用程序。 因此,用户必须登录。每个用户都属于一个组织(多租户)。
我将如何全局处理组织参数? 我当时认为这对于全局过滤器可能是一件好事,因为对于给定的组织,所有数据都需要过滤。 并且该组织与用户名关联,但不在同一表中。
例如我有这样的索引动作
public ActionResult Index()
{
var result = _repository.GetListByOrganisation(organisation);
return View(result);
}
我正在考虑具有一个全局属性,该属性根据给定的用户名查询数据库中的组织。 由于我的控制器已经包含authorize属性,因此我具有用户名。 最好缓存组织(会话,controllercontext),而不是在每次请求时都从db查询组织。
这是实现这种方式的一种方法吗? 还是还有其他更好的方法? 以及如何通过过滤器在controller / controllercontext上设置属性?
因此,对此的任何想法以及评论都是很棒的...
我会通过DI来做到这一点。
您可以使用第三方DI容器或您自己的代码。 无论哪种方式,您都希望基于每个请求设置组织ID。
因此,您将创建一个工作单元并将其注入到控制器中。 为了简单起见,我们假设您的工作单元是示例代码中的_repository
字段,即使大多数现实世界中的应用程序更为复杂。
您向控制器添加构造函数参数:
public FooController(IFooRepository repository)
{
this._repository = repository;
}
...以及FooRepository
上的组织ID:
public class FooRepository: IFooRepository
{
public FooRepository(long organizationId)
{
this._organizationId = organizationId;
}
}
现在,在您的DI容器设置或MVC控制器工厂中,您都需要进行以下设置:
builder.Register(c => new FooRepository(GetOrgIdForCurrentUser()).As<IFooRepository>();
builder.Register(c => new FooController(c.Resolve<IFooRepository>());
也许您可以将组织嵌入到URL中,例如,如果您的路由看起来像是/ {organization} / {controller} / {action}
那么您将获得如下网址
然后您将在控制器中通过方法的参数或通过RouteData对象接收组织。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.