ASP.NET Core 5中用SimpleInjector设置Web请求作用域遇InvalidOperationException
ASP.NET Core 5 中 SimpleInjector 请求作用域配置问题解决
核心问题原因
你当前的代码未将 SimpleInjector 与 ASP.NET Core 的请求生命周期管道集成,手动初始化的容器无法识别 ASP.NET 的请求作用域,导致使用 Lifestyle.Scoped 时抛出异常。旧版本的默认作用域配置方式已被弃用,需通过官方集成包完成作用域同步。
解决步骤
安装正确的集成包
确保安装以下 NuGet 包:Install-Package SimpleInjector.AspNetCore Install-Package SimpleInjector.Integration.AspNetCore.Mvc在 ASP.NET Core 管道中集成 SimpleInjector
不要在静态类中手动初始化容器,而是在Startup.cs(.NET 5 也可在Program.cs)中完成集成,让容器与 ASP.NET 的请求作用域绑定:public class Startup { public void ConfigureServices(IServiceCollection services) { // 添加 MVC 服务(按需启用) services.AddControllersWithViews(); // 集成 SimpleInjector services.AddSimpleInjector(container => { // 设置默认作用域为异步请求作用域,适配 ASP.NET Core 请求生命周期 container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle(); // 迁移原静态类中的服务注册逻辑 var assemblies = AppDomain.CurrentDomain.GetAssemblies() .Where(a => a.GetName().Name.StartsWith("Nordmann.Timetables")).ToList(); // General DomainConfig.Register(new DomainEventStoreProvider(container)); container.Register<IDomainEventStore, InMemoryDomainEventStore>(); container.Register<IEventDispatcher, Dispatcher>(Lifestyle.Scoped); container.Collection.Register(typeof(IEventHandler<>), assemblies); container.Register(typeof(IQueryHandler<,>), assemblies); // CM container.Register<INordmannUnitOfWork, NordmannUnitOfWork>(Lifestyle.Scoped); container.Register<UserApplicationService>(Lifestyle.Transient); // 开发环境启用容器验证,生产环境可关闭以提升启动性能 container.Verify(); }, options => { // 将 ASP.NET Core 内置服务注入到 SimpleInjector options.AddAspNetCore() .AddControllerActivation() .AddViewComponentActivation(); }); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // ... 其他中间件配置(如异常处理、静态文件等) // 启用 SimpleInjector 中间件,确保请求作用域正确创建与释放 app.UseSimpleInjector(); } }移除静态容器管理类
原ContainerManager静态类不再需要,容器已由 ASP.NET Core 管道托管。可通过依赖注入直接获取服务,或通过app.ApplicationServices.GetRequiredService<Container>()访问容器实例。
关键说明
AsyncScopedLifestyle是 ASP.NET Core 环境下推荐的作用域方式,支持异步请求场景。- 必须调用
app.UseSimpleInjector(),否则请求作用域无法被正确创建和释放。 - 容器验证(
container.Verify())建议仅在开发环境执行,避免生产环境启动时的性能开销。
内容的提问来源于stack exchange,提问作者nhaberl
相关产品推荐
相关产品推荐

