Autofac 3.0はMultitenantIntegrationをサポートし、そのプレビューリリースは現在リリースされています。試してみるために、次の構成でASP.NETWebAPIアプリケーションを作成しました。
public class Global : System.Web.HttpApplication {
protected void Application_Start(object sender, EventArgs e) {
var config = GlobalConfiguration.Configuration;
config.Routes.MapHttpRoute("Default", "api/{controller}");
RegisterDependencies(config);
}
public void RegisterDependencies(HttpConfiguration config) {
var builder = new ContainerBuilder();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
// creates a logger instance per tenant
builder.RegisterType<LoggerService>().As<ILoggerService>().InstancePerTenant();
var mtc = new MultitenantContainer(
new RequestParameterTenantIdentificationStrategy("tenant"),
builder.Build());
config.DependencyResolver = new AutofacWebApiDependencyResolver(mtc);
}
}
それは仕事を成し遂げ、テナントごとにLoggerService
インスタンスを作成します。ILoggerService
この段階では、解決できなかった2つの問題があります。
RequestParameterTenantIdentificationStrategy
このデモアプリケーション専用のTenantIdentificationStrategyとして、ここで提供されている箱から出して使用しました。インターフェイスを実装することで、カスタムTenantIdentificationStrategyを作成できITenantIdentificationStrategy
ます。ただし、のTryIdentifyTenant
方法では、APIをホスティングに依存しないようにするため、ASP.NET Web API環境では望ましくないITenantIdentificationStrategy
静的インスタンスに依存するようになります(この作業をに委任できることはわかっています)HttpContext.Current
ホスティングレイヤーですが、私はむしろしたくないです)。静的インスタンスに依存しない方法でこれを実現する別の方法はありますか?また、以下のようにテナント固有のインスタンスを登録する機会があります。
mtc.ConfigureTenant("tenant1", cb => cb.RegisterType<Foo>() .As<IFoo>().InstancePerApiRequest());
ただし、私の状況の1つでは、コンストラクターパラメーターを介してテナント名を渡す必要があり、次のようなものが必要です。
mtc.ConfigureTenant((cb, tenantName) => cb.RegisterType<Foo>() .As<IFoo>() .WithParameter("tenantName", tenantName) .InstancePerApiRequest());
現在、そのようなAPIはありません。これを達成する別の方法はありますか、またはこの種の要件は意味がありませんか?