之前看到技術群裡有同學討論說對於MinimalApi能接入到Swagger中感到很神奇,加上Swagger的資料本身是支援OpenApi2.0
和OpenApi3.0
使得swagger.json
成為了許多介面檔案管理工具的標準資料來源。ASP.NET Core能夠輕鬆快速的整合Swagger得益於微軟對OpenApi的大力支援,大部分情況下幾乎是新增預設設定,就能很好的工作了。這一切都是得益於ASP.NET Core底層提供了對介面後設資料的描述和對終結點的相關描述。本文我們就通過MinimalApi來了解一下ASP.NET Core為何能更好的整合Swagger。
雖然我們討論的是MInimalApi與Swagger資料來源的關係,但是為了使得看起來更清晰,我們還是先看一下MinimalApi如何整合到Swagger,直接上程式碼
var builder = WebApplication.CreateBuilder(args);
//這是重點,是ASP.NET Core自身提供的
builder.Services.AddEndpointsApiExplorer();
//新增swagger設定
builder.Services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new()
{
Title = builder.Environment.ApplicationName,
Version = "v1"
});
});
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
//swagger終結點
app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json",
$"{builder.Environment.ApplicationName} v1"));
}
app.MapGet("/swag", () => "Hello Swagger!");
app.Run();
上面我們提到了AddEndpointsApiExplorer
是ASP.NET Core自身提供的,但是如果使得MinimalApi能在Swagger中展示就必須要新增這個服務。所以Swagger還是那個Swagger,變的是ASP.NET Core本身,但是變化是如何適配資料來源的問題,Swagger便是建立在這個便利基礎上。接下來咱們就通過原始碼看一下它們之間的關係。
想了解它們的關係就會涉及到兩個主角,一個是swagger的資料來源來自何處,另一個是ASP.NET Core是如何提供這個資料來源的。首先我們來看一下Swagger的資料來源來自何處。
熟悉Swashbuckle.AspNetCore
的應該知道它其實是由幾個程式集一起構建的,也就是說Swashbuckle.AspNetCore
本身是一個解決方案,不過這不是重點,其中生成Swagger.json
的是在Swashbuckle.AspNetCore.SwaggerGen
程式集中,直接找到位置在SwaggerGenerator
類中[點選檢視原始碼