我很确定我在这里错过了一个非常基本和简单的事情。
我正在使用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
创建一个新的生命周期范围,然后使用该生命周期范围解析,但这对我来说不合适。
答案 0 :(得分:2)
如果您注册的内容为InstancePerRequest
或InstancePerApiRequest
,则无法在请求之外解决此问题。
如果您需要解决请求生命周期之外的依赖关系(在实际API请求之外),请为其选择不同的生命周期。 InstancePerLifetimeScope
非常接近InstancePerApiRequest
,也可以按请求进行操作。
但要小心:如果您在容器的请求之外解析某些内容并且它是IDisposable
,那么该对象将在应用程序的生命周期内保留,因为Autofac会保留它并试着为你处理它。如果您不知道该行为,这可能是一个缓慢的内存泄漏。 You can read more about that on the Autofac wiki.