You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 5中用SimpleInjector设置Web请求作用域遇InvalidOperationException

ASP.NET Core 5 中 SimpleInjector 请求作用域配置问题解决

核心问题原因

你当前的代码未将 SimpleInjector 与 ASP.NET Core 的请求生命周期管道集成,手动初始化的容器无法识别 ASP.NET 的请求作用域,导致使用 Lifestyle.Scoped 时抛出异常。旧版本的默认作用域配置方式已被弃用,需通过官方集成包完成作用域同步。

解决步骤

  1. 安装正确的集成包
    确保安装以下 NuGet 包:

    Install-Package SimpleInjector.AspNetCore
    Install-Package SimpleInjector.Integration.AspNetCore.Mvc
    
  2. 在 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();
        }
    }
    
  3. 移除静态容器管理类
    原 ContainerManager 静态类不再需要,容器已由 ASP.NET Core 管道托管。可通过依赖注入直接获取服务,或通过 app.ApplicationServices.GetRequiredService<Container>() 访问容器实例。

关键说明

  • AsyncScopedLifestyle 是 ASP.NET Core 环境下推荐的作用域方式,支持异步请求场景。
  • 必须调用 app.UseSimpleInjector(),否则请求作用域无法被正确创建和释放。
  • 容器验证(container.Verify())建议仅在开发环境执行,避免生产环境启动时的性能开销。

内容的提问来源于stack exchange,提问作者nhaberl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:57:26