1

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

4

1 回答 1

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>

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

于 2012-11-27T17:39:38.490 回答