在ASP.NET MVC中使用StructureMap注入多租户存储库

Pet*_*ron 6 structuremap asp.net-mvc routing repository multi-tenant

我正在多租户ASP.NET MVC应用程序中实现StructureMap,以注入我的租户存储库的实例,这些存储库基于ITenantContext接口检索数据.该Tenant问题由下式确定RouteData在一个基本控制器的 OnActionExecuting.

如何告诉StructureMap构造TenantContext(tenantID);tenantID从我的RouteData或某个基本控制器属性派生的位置?

基础控制器

鉴于以下路线:

{tenant}/{controller}/{action}/{id}
Run Code Online (Sandbox Code Playgroud)

我的基本控制器Tenant根据{tenant} URL参数检索并存储正确的.使用时Tenant,ITenantContext可以构建具有an的存储库,以仅检索与该租户相关的数据.

根据其他DI问题,可能AbstractFactory是一个解决方案?

Jos*_*gan 7

不要将租户存储在控制器上,因为您发现注册服务无法使用它.创建一个瘦服务,其唯一责任是确定租户标识符.该服务可以直接访问静态和HttpContext.这个类实际上不需要是可单元测试的 - 它的目的是隔离系统的其余部分,以便其他类是可测试的.

如果您想ITenantContext成为该服务,它可能看起来像:

public class TenantContext : ITenantContext
{
    public string GetTenant()
    {
        var routeData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(HttpContext.Current));
        return routeData.GetRequiredString("tenant");
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您的控制器可能只依赖于您的存储库接口,并且您的存储库实现(任何其他关心的服务)都可以依赖ITenantContext.控制器不需要知道租户.