0

我有一个已实现成员资格的 asp.net mvc 应用程序。因此,用户必须登录。每个用户都属于一个组织(多租户)。

我将如何在全球范围内处理组织参数?我认为这对于全局过滤器可能是一件好事,因为需要为给定组织过滤所有数据。并且组织与用户名连接但不在同一个表中。

例如我有一个这样的索引操作

public ActionResult Index()
{
var result = _repository.GetListByOrganisation(organisation);
return View(result);
}

我正在考虑有一个全局属性,它可以根据给定的用户名查询组织的数据库。由于我的控制器已经包含授权属性,所以我有用户名。缓存组织(会话,控制器上下文)而不是在每个请求上从 db 查询组织会很好。

这是一种实现这样的方法吗?或者还有其他更好的方法吗?以及如何从过滤器中设置控制器/控制器上下文的属性?

所以关于这个的任何想法以及评论都会很棒......

4

2 回答 2

2

我会通过 DI 做到这一点。

您可以使用第三方 DI 容器或您自己的代码。无论哪种方式,您都希望基于每个请求设置组织 ID 。

因此,您将创建一个工作单元并将其注入您的控制器。为简单起见,我们假设您的工作单元是_repository示例代码中的字段,即使大多数实际应用程序更复杂。

您将构造函数参数添加到控制器:

public FooController(IFooRepository repository)
{
    this._repository = repository;
}

...和一个组织 ID FooRepository

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>());
于 2011-03-10T14:21:44.010 回答
1

也许您可以将组织嵌入到 URL 中,例如,如果您的路线看起来像这样 /{organization}/{controller}/{action}

然后你会得到像

  • /bigorg/产品/列表
  • /smallorg/产品/列表

您将在您的控制器中收到组织,或者是您的方法的参数,或者通过 RouteData 对象。

于 2011-03-10T14:20:41.647 回答