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