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
相关产品推荐
相关产品推荐

