求.NET 8下兼容WebApplicationFactory与OpenApi的ASP.NET Core传统显式Program.cs模板
求.NET 8下兼容WebApplicationFactory与OpenApi的ASP.NET Core传统显式Program.cs模板
太懂你这种讨厌“编译器黑魔法”的心情了——那种隐式的Program.cs总让人觉得不踏实,还是传统的显式类和入口方法来得明明白白。下面给你一个.NET 8下的完整模板,不仅保留了经典的显式结构,还完美兼容WebApplicationFactory测试和OpenApi:
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.OpenApi.Models; public class Program { // 显式的程序入口,和传统.NET程序完全一致 public static async Task Main(string[] args) { var host = CreateHostBuilder(args).Build(); await host.RunAsync(); } // WebApplicationFactory自动查找的核心方法,必须严格匹配签名 public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.ConfigureServices(services => { // 添加API控制器支持(MVC项目可替换为AddControllersWithViews) services.AddControllers(); // 配置OpenApi/Swagger服务 services.AddEndpointsApiExplorer(); services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "你的API名称", Version = "v1" }); }); }) .Configure(app => { var env = app.ApplicationServices.GetRequiredService<IWebHostEnvironment>(); // 开发环境启用Swagger UI if (env.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "你的API V1"); }); } app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthorization(); // 映射控制器路由(Razor Pages项目可替换为MapRazorPages) app.MapControllers(); }); }); }
关键细节拆解
- 显式Main入口:完全抛弃隐式逻辑,手动创建并运行Host,所有流程都在你的掌控中,没有编译器生成的隐藏代码。
- CreateHostBuilder方法:严格遵循WebApplicationFactory要求的
public static IHostBuilder CreateHostBuilder(string[] args)签名——测试框架会自动扫描这个方法来构建测试环境的Host,不需要额外配置就能实现集成测试。 - Host与WebHost配置:
Host.CreateDefaultBuilder(args)会帮你初始化默认的Host配置(比如读取appsettings.json、环境变量、命令行参数等),和minimal API的默认行为完全一致;ConfigureWebHostDefaults则是连接传统Host和ASP.NET Core Web配置的桥梁,让你能像写minimal API一样配置服务和中间件。 - OpenApi兼容:完整集成了Microsoft.AspNetCore.OpenApi包的所有必要配置,包括注册Swagger生成服务、定义API文档信息,以及开发环境下启用Swagger UI,和.NET 8的生态完美适配。
- 灵活适配项目类型:如果是MVC项目,把
AddControllers换成AddControllersWithViews、MapControllers换成传统MVC路由配置即可;如果是Razor Pages项目,替换为AddRazorPages和MapRazorPages就行。
测试兼容示例
在你的集成测试类中,只需要指定Program作为入口点,WebApplicationFactory会自动调用我们的CreateHostBuilder方法:
public class YourApiIntegrationTests : IClassFixture<WebApplicationFactory<Program>> { private readonly WebApplicationFactory<Program> _factory; public YourApiIntegrationTests(WebApplicationFactory<Program> factory) { _factory = factory; } // 这里写你的测试方法,比如: [Fact] public async Task Get_EndpointsReturnSuccessAndCorrectContentType() { var client = _factory.CreateClient(); var response = await client.GetAsync("/api/your-endpoint"); response.EnsureSuccessStatusCode(); Assert.Equal("application/json; charset=utf-8", response.Content.Headers.ContentType.ToString()); } }
这个模板是通用型的,不管你做纯API还是带视图的Web项目,都能直接用或者按需微调,完全满足你“显式可控、兼容测试、支持OpenApi”的需求。
内容来源于stack exchange
相关产品推荐
相关产品推荐

