Autofac 3.0 将支持MultitenantIntegration ,其预览版现已发布。为了尝试,我创建了一个 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。是否有另一种方法来实现这个或这种要求没有任何意义?