You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET 6中GetRequiredService获取控制器单元测试失败问题

核心差异分析及解决方法

问题的关键在于ASP.NET 6中控制器程序集的默认扫描范围差异:

  • 在Web项目的Main方法中,AddControllersWithViews()默认会扫描当前Web项目的程序集(即包含Program类的程序集),因此能正确发现HomeController,再通过AddControllersAsServices()将其注册为服务,所以app.Services.GetRequiredService<HomeController>()可以成功执行。
  • 在单元测试中,调用Program.BuildApp()时,AddControllersWithViews()默认扫描的是单元测试项目的程序集,而非Web项目的程序集,导致HomeController未被识别,也就没有被注册为服务,最终触发No service for type...的错误。

解决方法

修改BuildApp方法,明确指定要扫描的控制器所在程序集,确保无论在Web项目还是单元测试环境下,都能正确注册控制器:

public static WebApplication BuildApp(string[] args)
{
    var builder = WebApplication.CreateBuilder(args);
    builder.Services.AddControllersWithViews()
                    .AddControllersAsServices()
                    // 手动指定包含HomeController的程序集
                    .AddApplicationPart(typeof(HomeController).Assembly);
    var app = builder.Build();
    return app;
}

如果Program类和控制器在同一个Web项目中,也可以用typeof(Program).Assembly代替typeof(HomeController).Assembly,效果一致。

内容的提问来源于stack exchange,提问作者Jacob Foshee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 02:20:27