You need to enable JavaScript to run this app. Blazor依赖注入报错:无法解析作用域服务ICookieRepository问题求助
优惠活动
大模型
产品
解决方案
定价
更多

Blazor依赖注入报错:无法解析作用域服务ICookieRepository问题求助

错误根因

默认注册的IDbContextFactory是单例生命周期,会从根服务提供者解析依赖;而你注册的ICookieRepository是Scoped生命周期,根服务提供者无法直接解析Scoped服务,因此触发报错。


解决方案

方案1:修改DbContextFactory生命周期(最适配现有代码)

修改Startup.cs里AddDbContextFactory的注册代码,手动指定Factory的生命周期为Scoped,使其可以从当前请求/Blazor连接的作用域中解析依赖:

services.AddDbContextFactory<OlqtContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))
                .LogTo(log => Debug.WriteLine(log),
                    new[] { DbLoggerCategory.Database.Command.Name },
                    Microsoft.Extensions.Logging.LogLevel.Information)
                .EnableSensitiveDataLogging(),
    ServiceLifetime.Scoped); // 新增这行,将Factory生命周期改为Scoped

修改后每个Blazor连接的作用域会持有独立的Factory,创建DbContext时就能正常解析当前作用域内的ICookieRepository实例。

补充注意事项

你当前使用了ServerPrerendered预渲染模式,预渲染阶段用户还未建立连接,此时ICookieRepository的LoginId会是默认值0,如果不需要预渲染,可以将_Host.cshtml里组件的渲染模式改成Server,避免预渲染阶段的审计字段异常。

方案2(可选,不修改Factory生命周期)

如果不想调整Factory的生命周期,可以将审计逻辑从DbContext中移出,改为在仓储层调用SaveChangesAsync之前手动赋值审计字段,无需在DbContext构造函数中注入Scoped服务,从根源避免跨生命周期的依赖解析问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 12:45:03