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

Singleton服务注入Scoped服务报错?ASP.NET Core依赖注入问题解决

问题原因

你遇到的错误核心是Singleton生命周期的服务不能直接依赖Scoped生命周期的服务:Singleton是应用启动时创建、直到应用关闭才销毁的全局实例,而Scoped是每个请求周期创建的实例。直接注入会导致Scoped实例被Singleton长期持有,既破坏了Scoped的生命周期语义,还可能引发线程安全问题,所以ASP.NET Core的DI容器会直接阻止这种不合理的依赖。

解决方案

方案一:调整服务生命周期,让依赖双方匹配

如果业务允许,将Request的生命周期改为Scoped,使两者生命周期一致:

services.AddScoped<Request>();
services.AddScoped<NewService>();

方案二:通过IServiceScopeFactory动态创建Scoped实例

若Request必须保持Singleton生命周期,可在其中注入IServiceScopeFactory,每次需要使用NewService时动态创建作用域并获取实例,使用后及时释放:
修改Request类的实现:

private readonly IServiceScopeFactory _scopeFactory;

public Request(IServiceScopeFactory scopeFactory)
{
    _scopeFactory = scopeFactory;
}

public void ExecuteServiceLogic()
{
    // 每次使用时创建独立作用域
    using (var scope = _scopeFactory.CreateScope())
    {
        var service = scope.ServiceProvider.GetRequiredService<NewService>();
        // 调用NewService的业务方法
        service.ProcessRequest();
    } // 作用域释放时,NewService实例也会被销毁
}

方案三:将NewService改为Singleton(业务场景允许时)

如果NewService本身是无状态、线程安全的,不需要依赖请求级别的上下文,可直接将其改为Singleton生命周期:

services.AddSingleton<Request>();
services.AddSingleton<NewService>();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 09:45:33