12

在基于 Rob Conery 的 MVC Storefront 的多租户 ASP.NET MVC 应用程序中,我应该过滤存储库服务层中的租户数据吗?

1. 过滤仓库中租户的数据:

public interface IJobRepository
{
    IQueryable<Job> GetJobs(short tenantId);
}

2.让服务按租户过滤存储库数据:

public interface IJobService
{
    IList<Job> GetJobs(short tenantId);
}

我的直觉是在服务层(选项 2)中执行此操作,但可以说每个租户本质上都应该拥有自己的“虚拟存储库”(选项 1),而这个责任在于存储库。

  • 哪种方法最优雅:选项 1、选项 2 还是有更好的方法?

更新:

我尝试了在存储库中过滤的建议想法,但问题是我的应用程序提供了租户上下文(通过子域)并且只与服务层交互。将上下文一直传递到存储库层是一项任务。

因此,我选择在服务层过滤我的数据。我认为存储库应该代表存储库中物理可用的所有数据,并使用适当的过滤器来检索特定于租户的数据,以供服务层使用。

最终更新:

由于不必要的复杂性,我最终放弃了这种方法。请看下面我的回答。

4

2 回答 2

5

@FreshCode,我们在存储库中进行,我们不将租户作为参数传递。我们使用以下方法:

public IQueryable<Job> GetJobs()
{
    return _db.Jobs.Where(j=>j.TenantId == Context.TenantId);
}

上下文是存储库具有的依赖项,它是在 BeginRequest 中创建的,例如,您可以在其中根据 url 确定租户。我认为这种方式非常透明,您可以避免tenantId可能会变得有点令人不安的参数。

问候。

于 2010-04-30T15:08:17.807 回答
3

更新:不采用多租户方法使我花费了数百小时的技术债务。四年后,我希望我能花时间首先实施清洁租户方法。不要犯同样的错误!


旧的,过时的答案:

我最终剥离了所有多租户代码,转而为每个租户使用单独的应用程序和数据库。就我而言,我很少有不经常更换的租户,所以我可以做到这一点。

我所有的控制器、成员提供者、角色提供者、服务和存储库都倾向于到处重复.WithTenantID(...)代码,这让我意识到我真的不需要一张Users表来访问 99% 的时间特定于一个租户的数据,因此使用单独的应用程序更有意义,并使一切变得如此简单。

感谢您的回答 - 他们让我意识到我需要重新设计。

于 2010-05-08T13:15:38.367 回答