Asp.net mvc 在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

我正在一个多租户ASP.NET MVC应用程序中实现StructureMap,以注入我的租户存储库的实例,这些存储库基于
ITenantContext
接口检索数据。所讨论的
租户
是根据基本控制器的
操作执行中的
路由数据
确定的

如何告诉StructureMap构造
TenantContext(tenantID)其中tenantID是从my
RoutedData
或某个基本控制器属性派生的

基本控制器 给定以下路线:

{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
。控制器不需要了解租户。

我的控制器依赖于一个服务,该服务依赖于多个存储库。我将研究注入方法。