Asp.net mvc 在ASP.NET MVC中使用StructureMap注入多租户存储库
我正在一个多租户ASP.NET MVC应用程序中实现StructureMap,以注入我的租户存储库的实例,这些存储库基于Asp.net mvc 在ASP.NET MVC中使用StructureMap注入多租户存储库,asp.net-mvc,routing,structuremap,multi-tenant,repository,Asp.net Mvc,Routing,Structuremap,Multi Tenant,Repository,我正在一个多租户ASP.NET MVC应用程序中实现StructureMap,以注入我的租户存储库的实例,这些存储库基于ITenantContext接口检索数据。所讨论的租户是根据基本控制器的操作执行中的路由数据确定的 如何告诉StructureMap构造TenantContext(tenantID)其中tenantID是从myRoutedData或某个基本控制器属性派生的 基本控制器 给定以下路线: {tenant}/{controller}/{action}/{id} My base co
ITenantContext
接口检索数据。所讨论的租户
是根据基本控制器的操作执行中的路由数据
确定的
如何告诉StructureMap构造TenantContext(tenantID)代码>其中tenantID是从myRoutedData
或某个基本控制器属性派生的
基本控制器
给定以下路线:
{tenant}/{controller}/{action}/{id}
My base controller根据{Tenant}URL参数检索并存储正确的租户
。使用Tenant
,可以构建具有ITenantContext
的存储库,以仅检索与该租户相关的数据
基于其他DI问题,AbstractFactory
能成为解决方案吗?@FreshCode,我不知道您是否直接依赖于控制器中的存储库,或者控制器是否依赖于服务,而服务反过来又依赖于存储库。但是,当控制器由structuremap实例化时,服务或存储库应该已经实例化。我们在Begin_请求上确定租户,并使用inject方法将实例化的上下文注入structuremap。它在控制器工厂执行之前执行,因此当控制器实例化时,它的所有依赖项都已创建
注意。不要将租户存储在控制器上,因为正如您所发现的,它将不可用于注入服务。创建一个精简服务,其唯一责任是确定租户标识符。该服务可以直接访问statics和HttpContext。这个类实际上不需要是单元可测试的——它的目的是隔离系统的其余部分,以便其他类是可测试的
如果希望ITenantContext
成为该服务,它可能看起来像:
public class TenantContext : ITenantContext
{
public string GetTenant()
{
var routeData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(HttpContext.Current));
return routeData.GetRequiredString("tenant");
}
}
现在,您的控制器可以依赖于您的存储库接口,而您的存储库实现(任何其他相关服务)可以依赖于ITenantContext
。控制器不需要了解租户。我的控制器依赖于一个服务,该服务依赖于多个存储库。我将研究注入方法。