ASP.NET Core 6 Minimal API
Intro
微軟在 ASP.NET 6 Preview 4 的介紹文章中介紹了即將到來的 ASP.NET Core 6 中的最小 API 的雛形,我們現在已經基本可以達到最小化 API 了雛形了,在 Preview 4 的時候就寫了這個小示例,但是不夠簡潔,沒有達到最簡潔的代碼,現在在 Preview 5 上嘗試一下,感覺已經很簡潔了,於是就想分享一下
Sample-0
在 Preview 4 的時候,示例是下面這樣的:
using System;
using Microsoft.AspNetCore.Builder;
var app = WebApplication.Create(args);
app.Map("/", (Func<string>)(() => "Hello World"));
app.Run();
主要是使用了新增的 WebApplication
/WebApplicationBuilder
API,然後結合了 C# 9 中的 Top-Level Statement,去掉了 Main 方法的聲明
C# 10 New Features
在即將到來 C# 10 中的兩個新特性可以幫助我們簡化這個特性,分別是:
- global using
- lamdba 優化
通過 global using 這個 feature 我們可以實現命令空間的統一管理這樣就可以避免寫很多 namespace 的引用了,我們可以把常用的 namespace 放在一個文件中管理,類似於 MVC 中的 _ViewImports.cshtml
和 Razor Page 中的 _Imports
,這樣就可以簡化上面的 using
了,之前看介紹說是,ASP.NET Core 6 會把 ASP.NET Core 相關的常用的命令空間通過 global using
的方式默認引用,這樣上面的示例中就不需要再引用命名空間了。
另外一個 feature 則是對於 lambda 表達式的優化,可以自動進行類型推斷來隱式的轉換成委託,就可以簡化上面強制類型轉換成 Func<string>
了,就可以自動的隱式轉換了,
除此之外,我們還可以方便的在 lamdba 表達式上加 Attribute 註解,這有助於大大簡化 API 書寫的複雜度,具體看後面的示例吧
Sample-1
使用 C# 10 新特性之後的代碼:
var app = WebApplication.Create(args);
app.Map("/", () => "Hello World");
app.Run();
主要有兩點變化,一個是 Func<string>
的轉換不再需要了,一個是命名空間的引用,會放在一個單獨 Imports 文件中添加全局的命名空間引用
Imports
內容如下:
global using System;
global using System.Collections.Generic;
global using System.Linq;
global using System.Threading.Tasks;
global using Microsoft.AspNetCore.Builder;
global using Microsoft.AspNetCore.Http;
global using Microsoft.AspNetCore.Mvc;
global using Microsoft.AspNetCore.Hosting;
global using Microsoft.AspNetCore.Routing;
global using Microsoft.Extensions.DependencyInjection;
global using Microsoft.Extensions.Hosting;
global using Microsoft.Extensions.Logging;
global using Microsoft.Extensions.Configuration;
上面提到了我們可以很方便在 lamdba 表達式上使用 Attribute,下面我們就來一個例子:
var app = WebApplication.Create(args);
app.MapPost("/info", [HttpPost](IWebHostEnvironment env) => new
{
Time = DateTime.UtcNow,
env.EnvironmentName
});
app.Run();
除了 Attribute,我們還可以添加參數,參數可以自動從依賴注入服務中獲取,如上面的 IWebHostEnvironment
接着我們來測試一下我們的 API 看試試 work 了吧,現在我們已經可以使用 dotnet watch
來運行項目,會自動啓用 Hot Reload,但是測試發現,感覺現在的 ASP.NET Core 裏的 Hot Reload,還是有點問題,需要使用 Ctrl + R 來重新 build 才能生效,不知道是不是我姿勢不對,不知道大家有沒有遇到這樣的問題,希望後面的版本能夠解決這個問題
可以通過 dotnet watch 來啓動項目
接着我們就可以通過 http://localhost:5000
或者 https://localhost:5001
來訪問我們的 API 了
訪問 http://localhost:5000
,會看到下面的結果
直接訪問 http://localhost:5000/info
,會看到類似下面的結果,這是因爲我們的 info
API 只允許 POST 方式進行訪問
通過工具用 POST 方式訪問 http://localhost:5000/info
,可以看到類似下面的結果
可以看到我們的 API 都已經正常工作了~~
More
上面的示例代碼可以在 Github 上獲取 https://github.com/WeihanLi/SamplesInPractice/tree/master/net6sample/MininalAPI
編譯需要安裝 .NET 6 preview 5 環境
目前 .NET 6 Preview 還是有一些問題的,還不太建議大家實際項目進行升級,當然自己想嘗試是可以的
如果使用遇到了什麼問題,也可以通過 Github 上的 issue 向微軟反饋 https://github.com/dotnet/core/issues/6389
References
- https://devblogs.microsoft.com/aspnet/asp-net-core-updates-in-net-6-preview-4/
- https://github.com/WeihanLi/SamplesInPractice/tree/master/net6sample/MininalAPI