Autofac 3.0將有一個MultitenantIntegration支持和its preview release is out現在。爲了嘗試一下,我創建了以下配置一個ASP.NET Web API應用程序:Autofac多租戶IoC容器在ASP.NET Web API應用
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
每個租戶。我在這個階段,兩個問題,我是不是能解決:
- 我開箱即用的只是這個演示應用程序提供
RequestParameterTenantIdentificationStrategy
這裏作爲TenantIdentificationStrategy。我可以通過實施ITenantIdentificationStrategy
界面來創建自定義TenantIdentificationStrategy。然而,TryIdentifyTenant
方法ITenantIdentificationStrategy
使您依賴於一個靜態實例,如HttpContext.Current
這是我不想在ASP.NET Web API環境中的東西,因爲我希望我的API託管不可知論者(我知道我可以委託這項工作的託管層,但我寧願不)。有沒有另一種方式來實現這一點,我不會依賴一個靜態實例? 我也有機會登記爲以下租戶特定實例:
mtc.ConfigureTenant("tenant1", cb => cb.RegisterType<Foo>() .As<IFoo>().InstancePerApiRequest());
然而,我的情形之一,需要我通過構造函數的參數傳遞房客的名字,我很想有類似下面:
mtc.ConfigureTenant((cb, tenantName) => cb.RegisterType<Foo>() .As<IFoo>() .WithParameter("tenantName", tenantName) .InstancePerApiRequest());
目前沒有這樣的API。還有另外一種方法可以達到這個要求嗎?或者這種要求沒有任何意義?
謝謝特拉維斯。真的很有幫助。你最後的樣品真的是我正在尋找的。我應該考慮過之前:)所以,我的ITenantIdentificationStrategy需要真正的靜態對象。那麼對我來說沒有其他選擇,而不是將'TenantIdentificationStrategy'委託給具有每個請求靜態上下文的宿主層。 – tugberk