我开始使用autofac的多租户集成,我有一个问题: 我可以添加仅适用于特定租户的控制器吗? 我知道你可以覆盖在基本容器中注册的控制器,但是我想要一个仅适用于已注册的租户的控制器? 这可能吗?
答案 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>
但是,就像我说的那样,我没有尝试过。我只做过控制器覆盖。