控制器依赖注入ApplicationDbContext失败的问题求助
解决ApplicationDbContext依赖注入错误
错误原因
ASP.NET Core依赖注入容器未注册ApplicationDbContext服务,导致控制器激活时无法解析该类型的实例。
解决方案步骤
1. 配置连接字符串(推荐做法)
将硬编码的连接字符串移至appsettings.json,便于管理和修改:
{ "ConnectionStrings": { "DefaultConnection": "Server=localhost\\SQLEXPRESS;Database=DarkCrow;Trusted_Connection=True;TrustServerCertificate=True;" } }
2. 移除上下文类中的硬编码配置
修改ApplicationDbContext的OnConfiguring方法,删除硬编码的连接字符串配置(依赖注入会在注册时提供配置):
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { // 无需硬编码配置,依赖注入会传入已配置的options }
3. 注册ApplicationDbContext到依赖注入容器
根据你的.NET版本,在启动类中注册上下文服务:
.NET 6+(Program.cs顶级语句)
var builder = WebApplication.CreateBuilder(args); // 添加MVC服务 builder.Services.AddControllersWithViews(); // 注册ApplicationDbContext builder.Services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))); // 注册Identity服务(如果项目使用Identity) builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<ApplicationDbContext>(); var app = builder.Build(); // 中间件配置 app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.MapRazorPages(); app.Run();
.NET 5及以前(Startup.cs)
在ConfigureServices方法中添加注册代码:
public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(); // 注册ApplicationDbContext services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); // 注册Identity服务(如果项目使用Identity) services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<ApplicationDbContext>(); }
说明
AddDbContext<T>方法会将ApplicationDbContext注册为作用域服务(每个请求创建一个实例),依赖注入容器会自动处理控制器构造函数中的参数解析,解决注入失败的问题。
内容的提问来源于stack exchange,提问作者BUIBBE
相关产品推荐
相关产品推荐

