ASP.NET Core 6 Minimal API ASP.NET Core 6 Minimal API

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章