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