.NET 7 MVC添加WebAPI控制器后依赖注入失效问题
问题描述
在.NET 7 MVC应用中添加WebAPI控制器后,默认API功能正常,但给API控制器的构造函数注入ILogger时抛出异常:
无法找到类型“MVCAppWithApiTest.Controllers.ValuesController”的合适构造函数。请确保该类型是具体类型,且公共构造函数的所有参数均已注册为服务或作为参数传递。同时确保未提供多余参数。
MVC控制器的ILogger注入正常,尝试添加builder.Services.AddControllers()无效果,且.NET 7中找不到AddControllersAsService方法,需解决API控制器的依赖注入注册问题。
最小复现步骤
- 使用Visual Studio 2022创建“.NET 7 ASP.NET Core Web App (Model-View-Controller)”项目
- 给HomeController添加带
ILogger的公共构造函数,验证注入正常 - 添加默认的API控制器
ValuesController,验证无注入时API可正常访问 - 给
ValuesController添加无public修饰符的ILogger构造函数,调用API时抛出上述异常
解决方案
1. 修复构造函数的访问修饰符
异常核心原因是API控制器的构造函数缺少public修饰符,ASP.NET Core的控制器激活器仅能解析公共构造函数。修改ValuesController的构造函数:
public ILogger<ValuesController> _logger; // 添加public修饰符,同时推荐使用泛型ILogger<T>以优化日志标识 public ValuesController(ILogger<ValuesController> logger) { _logger = logger; }
2. 优化服务注册与路由配置
AddControllersWithViews()已经包含AddControllers()的所有服务注册逻辑,无需重复添加。同时需确保API路由被正确映射,在Program.cs中补充MapControllers():
var builder = WebApplication.CreateBuilder(args); // 一行代码即可同时支持MVC视图控制器和API控制器 builder.Services.AddControllersWithViews(); var app = builder.Build(); // ... 中间件配置(保持默认即可) ... app.UseAuthorization(); // 保留MVC默认路由规则 app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); // 添加API路由映射,确保API控制器能被正确识别 app.MapControllers(); app.Run();
3. 关于AddControllersAsService的说明
.NET 7中AddControllersAsService作为MvcBuilder的扩展方法存在,如需将控制器注册为服务(例如注入更多自定义依赖),可通过以下方式配置:
builder.Services.AddControllersWithViews() .AddControllersAsServices();
关键注意点
- 泛型
ILogger<T>是ASP.NET Core官方推荐用法,会自动带上控制器的类别名,便于日志筛选与定位 - 控制器的构造函数必须为
public,否则依赖注入容器无法解析 AddControllersWithViews()已覆盖API控制器的服务注册需求,无需单独调用AddControllers()
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

