ASP.NET Core 6 Minimal API
Intro
微軟在 ASP.NET 6 Preview 4 的介紹文章中介紹了即將到來的 ASP.NET Core 6 中的最小 API 的雛形簿废,我們現(xiàn)在已經(jīng)基本可以達(dá)到最小化 API 了雛形了瘾敢,在 Preview 4 的時候就寫了這個小示例砚尽,但是不夠簡潔罗岖,沒有達(dá)到最簡潔的代碼固该,現(xiàn)在在 Preview 5 上嘗試一下,感覺已經(jīng)很簡潔了递鹉,于是就想分享一下
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狰域,然后結(jié)合了 C# 9 中的 Top-Level Statement,去掉了 Main 方法的聲明
C# 10 New Features
在即將到來 C# 10 中的兩個新特性可以幫助我們簡化這個特性屈溉,分別是:
- global using
- lamdba 優(yōu)化
通過 global using 這個 feature 我們可以實現(xiàn)命令空間的統(tǒng)一管理這樣就可以避免寫很多 namespace 的引用了抬探,我們可以把常用的 namespace 放在一個文件中管理小压,類似于 MVC 中的 _ViewImports.cshtml
和 Razor Page 中的 _Imports
,這樣就可以簡化上面的 using
了仪搔,之前看介紹說是蜻牢,ASP.NET Core 6 會把 ASP.NET Core 相關(guān)的常用的命令空間通過 global using
的方式默認(rèn)引用,這樣上面的示例中就不需要再引用命名空間了煮嫌。
另外一個 feature 則是對于 lambda 表達(dá)式的優(yōu)化立膛,可以自動進行類型推斷來隱式的轉(zhuǎn)換成委托,就可以簡化上面強制類型轉(zhuǎn)換成 Func<string>
了好啰,就可以自動的隱式轉(zhuǎn)換了,
除此之外鳄抒,我們還可以方便的在 lamdba 表達(dá)式上加 Attribute 注解许溅,這有助于大大簡化 API 書寫的復(fù)雜度,具體看后面的示例吧
Sample-1
使用 C# 10 新特性之后的代碼:
var?app?=?WebApplication.Create(args);
app.Map("/",?()?=>?"Hello?World");
app.Run();
主要有兩點變化茬祷,一個是 Func<string>
的轉(zhuǎn)換不再需要了并蝗,一個是命名空間的引用滚停,會放在一個單獨 Imports 文件中添加全局的命名空間引用
Imports
內(nèi)容如下:
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 表達(dá)式上使用 Attribute键畴,下面我們就來一個例子:
var?app?=?WebApplication.Create(args);
app.MapPost("/info",?[HttpPost](IWebHostEnvironment?env)?=>?new?
{
????Time?=?DateTime.UtcNow,
????env.EnvironmentName?
});
app.Run();
除了 Attribute,我們還可以添加參數(shù)涡贱,參數(shù)可以自動從依賴注入服務(wù)中獲取盼产,如上面的 IWebHostEnvironment
接著我們來測試一下我們的 API 看試試 work 了吧勺馆,現(xiàn)在我們已經(jīng)可以使用 dotnet watch
來運行項目,會自動啟用 Hot Reload灌灾,但是測試發(fā)現(xiàn)锋喜,感覺現(xiàn)在的 ASP.NET Core 里的 Hot Reload豌鸡,還是有點問題,需要使用 Ctrl + R 來重新 build 才能生效涯冠,不知道是不是我姿勢不對蛇更,不知道大家有沒有遇到這樣的問題赛糟,希望后面的版本能夠解決這個問題
可以通過 dotnet watch 來啟動項目
接著我們就可以通過 http://localhost:5000
或者 https://localhost:5001
來訪問我們的 API 了
訪問 http://localhost:5000
,會看到下面的結(jié)果
直接訪問 http://localhost:5000/info
司倚,會看到類似下面的結(jié)果字旭,這是因為我們的 info
API 只允許 POST 方式進行訪問
通過工具用 POST 方式訪問 http://localhost:5000/info
遗淳,可以看到類似下面的結(jié)果
可以看到我們的 API 都已經(jīng)正常工作了~~
More
上面的示例代碼可以在 Github 上獲取 https://github.com/WeihanLi/SamplesInPractice/tree/master/net6sample/MininalAPI
編譯需要安裝 .NET 6 ?preview 5 環(huán)境
目前 .NET 6 Preview 還是有一些問題的屈暗,還不太建議大家實際項目進行升級养叛,當(dāng)然自己想嘗試是可以的
如果使用遇到了什么問題弃甥,也可以通過 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