.NET 6添加Identity脚手架后服务构造失败异常求助
问题排查与解决
核心原因分析
这个错误本质是依赖注入容器无法找到ApplicationDbContext的注册信息,导致创建UnitofWork实例时,无法注入所需的ApplicationDbContext。添加Identity后出现问题,大概率是Identity的DbContext配置和原有ApplicationDbContext的注册发生冲突或被覆盖。
排查步骤与解决方案
1. 检查Program.cs中的DbContext注册顺序
- 必须把
ApplicationDbContext的注册放在Identity服务注册之前,因为Identity默认会尝试注册自身的DbContext,可能覆盖你的自定义配置。 - 正确注册示例:
// 先注册自定义ApplicationDbContext builder.Services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))); // 再注册Identity,明确指定使用你的ApplicationDbContext builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<ApplicationDbContext>(); - 若使用
AddIdentity而非AddDefaultIdentity,同样要加上AddEntityFrameworkStores<ApplicationDbContext>,确保Identity使用你的DbContext而非默认生成的。
2. 验证ApplicationDbContext的继承关系
- 确认
ApplicationDbContext继承自IdentityDbContext(而非普通的DbContext),因为Identity需要包含用户、角色等实体的上下文:public class ApplicationDbContext : IdentityDbContext { public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { } // 你的其他DbSet定义... } - 如果之前是普通
DbContext,添加Identity后必须改成继承IdentityDbContext,否则Identity无法将它识别为自身的存储上下文。
3. 检查UnitofWork的构造函数注入是否正确
- 确保
UnitofWork的构造函数正确接收ApplicationDbContext,参数类型完全匹配:public class UnitofWork : IUnitofWork { private readonly ApplicationDbContext _db; public UnitofWork(ApplicationDbContext db) { _db = db; // 初始化你的Repository实例... } // UnitofWork的其他业务方法... } - 同时确认
UnitofWork已在DI容器中注册,比如:builder.Services.AddScoped<IUnitofWork, UnitofWork>();
4. 检查连接字符串配置
- 确认
appsettings.json中的DefaultConnection连接字符串存在且格式正确,保证DbContext注册时能正常读取:"ConnectionStrings": { "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=BulkyBookDb;Trusted_Connection=True;MultipleActiveResultSets=true" }
5. 清理重建项目
- 执行
dotnet clean和dotnet restore,清除可能存在的编译缓存问题; - 检查项目中是否存在多个
ApplicationDbContext定义(比如脚手架自动生成了新的DbContext但你没注意),导致DI容器混淆。
总结
最常见的问题就是Identity注册时未指定使用自定义的ApplicationDbContext,或者ApplicationDbContext的注册顺序错误。按照上述步骤逐一排查,基本能解决这个依赖注入失败的问题。
内容的提问来源于stack exchange,提问作者Sauron
相关产品推荐
相关产品推荐

