繁体   English   中英

我可以使用全局过滤器处理不同的多租户吗?

[英]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}

那么您将获得如下网址

  • / bigorg / products / list
  • / smallorg / products / list

然后您将在控制器中通过方法的参数或通过RouteData对象接收组织。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM