2012-11-26 20 views

回答

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> 

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

+0

你是对的;控制器获得了租户注册。调试过了一会儿,我发现DefaultControllerFactory没有找到控制器的正确类型(所以它要求的DependencyResolver之前失败)我还在工作之上,但它不是autofac的错,所以我会接受你的回答 – dmorganb

+0

我更新了我的答案,包括一些关于这方面的信息。 –

相关问题