首页 > 解决方案 > ASP.net core 3.0+ DependencyResolutionExcp 中的 Autofac:用于 InstancePerRequest 或 InstancePerMatchingLifeTimeScope

问题描述

处理请求时发生未处理的异常。

DependencyResolutionException:从请求实例的范围中看不到标签匹配“”的范围。

如果您在执行 Web 应用程序期间看到这种情况,这通常表明注册为 per-HTTP 请求的组件正在被 SingleInstance() 组件(或类似场景)请求。在 Web 集成下,总是从依赖解析器或请求生命周期范围请求依赖,而不是从容器本身。Autofac.Core.Lifetime.MatchingScopeLifetime.FindScope(ISharingLifetimeScope mostNestedVisibleScope)

DependencyResolutionException:无法解析类型“AutofacWebApplication.Service.TestService”,因为无法找到它所属的生命周期范围。此注册公开了以下服务: - AutofacWebApplication.Service.ITestService

详细信息 Autofac.Core.Resolving.Middleware.ScopeSelectionMiddleware.Execute(ResolveRequestContext context, Action next)

堆栈查询 Cookie 标头路由

DependencyResolutionException:从请求实例的范围中看不到标签匹配“”的范围。如果您在执行 Web 应用程序期间看到这种情况,这通常表明注册为 per-HTTP 请求的组件正在被 SingleInstance() 组件(或类似场景)请求。在 Web 集成下,总是从依赖解析器或请求生命周期范围请求依赖,而不是从容器本身。Autofac.Core.Lifetime.MatchingScopeLifetime.FindScope(ISharingLifetimeScope mostNestedVisibleScope) Autofac.Core.Resolving.Middleware.ScopeSelectionMiddleware.Execute(ResolveRequestContext context, Action next)

标签: autofacasp.net-core-3.1

解决方案


根据文档

使用 InstancePerLifetimeScope 而不是 InstancePerRequest。在以前的 ASP.NET 集成中,您可以注册一个依赖项,InstancePerRequest这样可以确保每个 HTTP 请求只创建一个依赖项实例。这是因为 Autofac 负责设置每个请求的生命周期范围。随着. Microsoft.Extensions.DependencyInjection_ _ 而不是注册您的依赖项InstancePerRequest,使用InstancePerLifetimeScope你应该得到同样的行为。请注意,如果您在 Web 请求期间创建自己的生命周期范围,您将在这些子范围中获得一个新实例。

除此之外 - 这意味着不要使用InstancePerMatchingLifetimeScope,因为正如你所看到的,没有一个会匹配。


推荐阅读