最小 API 并不是在 .NET 7 中才加入的,記得應該是在 .NET 6 中就已經提供,只是對我來說,到現在才開始使用。
創建一個最小 API
在 VS 2022 中創建 WebAPI 項目,不勾選使用控制器,創建出來的就是最小 API :
不勾選使用控制器,就會創建最小 API 模板;
啟用 OpenAPI ,默認會添加 Swagger;
頂級語句:頂級語句是 C# 9.0 中添加的新特性,如果勾選不使用,Program 類中還會出現 main 函數。
創建出來的工程只有兩個文件,重大的改變就是,沒有之前的 Startup 類了,只有一個 Program 和一個配置文件 appsetting.json:
Program 類的全部代碼如下:
var?builder?=?WebApplication.CreateBuilder(args);
//在下面添加服務器到容器,相當于之前?Startup?類中的?ConfigureServices?方法var?app?=?builder.Build();
//在下面編寫管道相關代碼,相當于之前?Startup?類中的?Configure?方法//在下面編寫接口,相當于之前?Controller?中的方法
var?summaries?=?new[]
{"Freezing",?"Bracing",?"Chilly",?"Cool",?"Mild",?"Warm",?"Balmy",?"Hot",?"Sweltering",?"Scorching"
};app.MapGet("/weatherforecast",?()?=>
{var?forecast?=?Enumerable.Range(1,?5).Select(index?=>new?WeatherForecast(DateOnly.FromDateTime(DateTime.Now.AddDays(index)),Random.Shared.Next(-20,?55),summaries[Random.Shared.Next(summaries.Length)])).ToArray();return?forecast;});//運行?API
app.Run();internal?record?WeatherForecast(DateOnly?Date,?int?TemperatureC,?string??Summary)
{public?int?TemperatureF?=>?32?+?(int)(TemperatureC?/?0.5556);
}
app.MapGet 方法接受兩個參數,第一個參數是一個字符串,為接口的訪問路徑,第二個參數是一個委托,用來編寫接口的業務邏輯。
從 MapGet 這個方法名可以看出,這是一個 Get 請求的接口方法,如果要使用 Post ,可以使用 MapPost 。
添加一個接口方法非常簡單,如下圖:
使用 Serilog 日志框架
1、安裝 NuGet 包:Serilog.AspNetCore,安裝這一個就會包含 Serilog 、Serilog.Sink.File 等。
2、在 Program 類的 builder 創建之后,添加對 Serilog 的使用:
using?Serilog;var?builder?=?WebApplication.CreateBuilder(args);
//在下面添加服務器到容器,相當于之前?Startup?類中的?ConfigureServices?方法
//添加對?serilog?的使用
builder.Host.UseSerilog((hostContext,?services,?configuration)?=>?{configuration.WriteTo.File("serilog-file.txt").WriteTo.Console();
});
var?app?=?builder.Build();
//?下面代碼省略
3、運行程序,會看到項目更目錄下會生成一個 serilog-file.txt 文本文件,里面記錄了所有日志;
4、在上面添加的 helloworld 方法中使用日志:
app.MapGet("/helloworld", () =>?
{Log.Information("helloworld.start");return "hello ,oec2003";});
Information 是日志級別,還有 Error、Warning、Fatal、Debug;
接口方法調用后,日志會寫入文本文件。
依賴注入
依賴注入一個常見的做法是使用構造函數進行注入,傳統的 WebAPI 中可以在 Controller 的構造函數中進行,但最小 API 沒有 Controller ,下面看看在最小 API 中是怎么注入的。
1、在 Program 類的最下面添加 IUser 接口和 User 類:
internal?interface?IUser
{string?GetName();
}
internal?class?User?:?IUser
{public?string?GetName(){return?"oec2003";}
}
2、在 Program 類的 builder 創建之后,添加依賴注入的配置:
builder.Services.AddTransient<IUser,?User>();
3、注入的地方由原來的構造函數變成了方法參數:
app.MapGet("/helloworld",??(IUser?user)?=>?
{return?$"hello?,?{user.GetName()}";});
配置
最小 API 的項目中的兩個文件,其中一個就是 appsetting.json 配置文件,下面以 Serilog 日志框架的配置為例,來演示怎樣讀取配置文件。
1、在上面的 Serilog 例子中,配置是在代碼中寫死的,現在將配置移到 appsetting.json 配置文件中。
"Serilog":?{"MinimumLevel":?"Information","Override":?{"Microsoft.AspNetCore":?"Warning"},"WriteTo":?[{"Name":?"Console"},{"Name":?"File","Args":?{"path":?"Serilogs\\serilog.log"}}]
}
2、修改 builder 部分的代碼:
builder.Host.UseSerilog((hostingContext,?loggerConfiguration)?=>????????????????loggerConfiguration.ReadFrom.Configuration(hostingContext.Configuration));
3、運行程序后,在程序根目錄下會創建 Serilogs 目錄,該目錄中會創建 serilog.log 文件。
總結
1、對于一些簡單的接口場景,使用最小 API 比較方便,都在一個文件中處理;
2、除了依賴注入式通過方法參數,其他很多地方跟之前用法類似,就是將 Startup 中 ConfigureServices 方法和 Configure 方法搬到了 Program 類的固定位置。