autofacのマルチテナンシー統合を使い始めましたが、質問があります。特定のテナントでのみ使用できるコントローラーを追加できますか?ベースコンテナに登録されているコントローラーを上書きできることは知っていますが、登録したテナントでのみ使用できるコントローラーが必要ですか?それは可能ですか?
1 に答える
まだ試していませんが、少し手作業で登録すればできると思います。
問題は、を使用してメインコンテナ内のすべてのコントローラを自動登録するbuilder.RegisterControllers(theAssembly)
と、テナント固有のコントローラを含むすべてのコントローラが自動的に取得されることです。(テナント固有のものが他のすべてのものとのアセンブリにあると想定します。)
簡単にするために、テナント固有のものを別のアセンブリに分割することをお勧めします。次に、1つのテナント専用のコントローラーを取得するには、次のようになります。
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>
しかし、私が言ったように、私はそれを試していません。私はこれまでコントローラーのオーバーライドを行っただけです。