我可以使用autofac添加租户特定控制器吗?

时间:2012-11-26 14:25:30

标签: autofac multi-tenant

我开始使用autofac的多租户集成,我有一个问题: 我可以添加仅适用于特定租户的控制器吗? 我知道你可以覆盖在基本容器中注册的控制器,但是我想要一个仅适用于已注册的租户的控制器? 这可能吗?

1 个答案:

答案 0 :(得分:3)

虽然我没有尝试过,但我相信你可以通过一些手动注册来做到这一点。

问题是,如果使用builder.RegisterControllers(theAssembly)自动注册主容器中的所有控制器,则将自动选择所有控制器 - 包括特定于租户的控制器。 (假设租户特定的一个人正在装配其他所有东西。)

为了方便您自己,您可能希望将特定于租户的内容拆分为单独的程序集。然后要获得仅适用于一个租户的控制器,它就是这样的:

var builder = new ContainerBuilder();
builder.RegisterControllers(commonControllerAssembly);
var appContainer = builder.Build();
var tenantStrategy = new MyTenantIdentificationStrategy();
var mtc = new MultitenantContainer(tenantStrategy, appContainer);

// Register the tenant-specific stuff when you configure the tenant.
mtc.ConfigureTenant(
  "tenant-1",
  b => b.RegisterControllers(tenantControllerAssembly));

// And don't forget to set the resolver.
DependencyResolver.SetResolver(new AutofacDependencyResolver(mtc));

就像任何其他特定于租户的依赖关系一样。

当MVC尝试解析控制器的实例时,它会从DependencyResolver执行此操作,它将以多租户方式运行,并且只有在正确的租户发出请求时才能解析控制器。如果其他租户请求该控制器,则在注册组件列表中找不到控制器,因此他们会收到错误。

请注意,如果将控制器放在主应用程序集未引用的单独程序集中,则可能还需要告知ASP.NET编译系统,否则将无法正确找到控制器类型。将其添加到system.web/compilation/assemblies列表:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.web>
        <compilation>
            <assemblies>
                <add assembly="The.Name.Of.Your.Assembly.Here" />
            </assemblies>
        </compilation>
    </system.web>
</configuration>

但是,就像我说的那样,我没有尝试过。我只做过控制器覆盖。