Autofac WebApi集成无法与MultiTenant Container一起使用

时间:2014-05-15 16:37:29

标签: asp.net-web-api autofac

我很确定我在这里错过了一个非常基本和简单的事情。

我正在使用Autofac及其多租户容器,如下所示

var builder = new ContainerBuilder();
// Registratino of modules here
var container = builder.Build();

var tenantStrategy = new AppSettingsTenantIdentifier(appSettings);
var mtc = new MultitenantContainer(tenantStrategy, container);

//在此处注册租户特定模块

var resolver = new AutofacWebApiDependencyResolver(mtc);

GlobalConfiguration.Configuration.DependencyResolver = resolver;

这是从Application_Start调用的。调用上面的内容后,我尝试解决其中一个已注册的类,如下所示

var webApiConfig = GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof (WebApiConfig)) as WebApiConfig;

此类的一个依赖项注册为InstancePerAPiRequest。此时我得到以下错误。

No scope with a Tag matching 'AutofacWebRequest' is visible from the scope in which the instance was requested. This generally indicates that a component registered as per-HTTP request is being requested by a SingleInstance() component (or a similar scenario.) Under the web integration always request dependencies from the DependencyResolver.Current or ILifetimeScopeProvider.RequestLifetime, never from the container itself. 

我不知道如何解决这个问题。我知道我可以使用标记AutofacWebRequest创建一个新的生命周期范围,然后使用该生命周期范围解析,但这对我来说不合适。

1 个答案:

答案 0 :(得分:2)

如果您注册的内容为InstancePerRequestInstancePerApiRequest,则无法在请求之外解决此问题。

如果您需要解决请求生命周期之外的依赖关系(在实际API请求之外),请为其选择不同的生命周期。 InstancePerLifetimeScope非常接近InstancePerApiRequest,也可以按请求进行操作。

但要小心:如果您在容器的请求之外解析某些内容并且它是IDisposable,那么该对象将在应用程序的生命周期内保留,因为Autofac会保留它并试着为你处理它。如果您不知道该行为,这可能是一个缓慢的内存泄漏。 You can read more about that on the Autofac wiki.