.NET 6中注入DbContext到类时构造函数找不到的问题排查
问题解决步骤
1. 修复DbContext构造函数的访问权限
报错的核心原因是MyApplicationDbContext的构造函数是私有的,依赖注入容器无法访问并创建该类的实例。只需给构造函数添加public修饰符:
// 修改后的DbContext代码 using MyApplication.Domain.Models; using Microsoft.EntityFrameworkCore; namespace MyApplication.Domain { public class MyApplicationDbContext : DbContext { public DbSet<ExampleModel> Examples { get; set; } // 添加public修饰符,让DI容器能访问 public MyApplicationDbContext(DbContextOptions<MyApplicationDbContext> options) : base(options) { } } }
2. 修正服务的生命周期注册
你当前把ExampleQuery和ExampleService注册为Singleton(单例),但DbContext默认是Scoped(请求域)生命周期——单例服务会长期持有DbContext实例,会引发资源泄漏、并发访问异常等问题。
需要将这两个服务改为Scoped注册,和DbContext的生命周期保持一致:
// 修改后的Program.cs注册代码 builder.Services.AddDbContext<MyApplicationDbContext>(dbContextOptions => dbContextOptions.UseSqlServer(builder.Configuration.GetConnectionString("MyApplication"))); // 替换AddSingleton为AddScoped builder.Services.AddScoped<ExampleQuery>(); builder.Services.AddScoped<ExampleService>();
额外优化提示
- 获取连接字符串时,用
GetConnectionString比GetValue<string>更简洁,也符合EF Core的常规用法 ExampleQuery的Query方法可以返回IQueryable<ExampleModel>,这样上层可以进一步做筛选、分页等操作,而不是直接返回IEnumerable(会立即执行查询)
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

