.NETをPythonまたはNodeと比較する場合、不満の1つは、新しいプロジェクトの設定に関する形式的な作業の量である。最も単純なWebサービスでさえ、Programクラス、Startupクラス、1つ以上のControllerクラスが必要である。対照的に、Redditユーザのammar2によって示されたPythonのWebサービスの一式は次のとおりである。
from fastapi import FastAPI
import python_weather
app = FastAPI()
@app.get("/api/weather/washington")
async def root():
weather = await python_weather.Client().find("Washington DC")
return weather
ローコードシナリオで競争するために、Microsoftは必要なコードの量を劇的に削減した。最小限の例を次に示す。
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Hosting;
var app = WebApplication.Create(args);
app.MapGet("/", (Func<string>)(() => "Hello World!"));
app.Run();
ご覧のとおり、開発者はクラスを定義する必要さえない。代わりに、開発者はC# 9のトップレベルステートメントと簡略化されたASP.NET Core APIを組み合わせることができる。
C# 10のさらなる機能強化により、(Func<string>)
キャスト操作が不要になった。提案された構文を使用してTODO APIを呼び出す例を次に示す。
app.MapGet("/api/todos", [Authorize](TodoDbContext db) => db.Todos.ToListAsync());
上記の行は次のように解釈できる。
- パス/api/todosにHttpGetメソッドを登録する
- ユーザが承認されていることを要求する
- TodoDbContextタイプのDBコンテキストを挿入する
- 非同期でデータベースからTodoオブジェクトのリストを返す
ASP.NET Core 5で相当するものは次の通りである。
[ApiController]
[Route("/api/todos")]
public class TodoController : ControllerBase
{
readonly TodoDbContext _db;
public TodoController(TodoDbContext db)
{
_db = db;
}
[HttpGet]
[Authorize]
public Task<Todo> GetAll()
{
return _db.Todos.ToListAsync();
}
}
このモデルにはいくつかの制限がある。たとえば、Swaggerのドキュメントを置く場所がない。通常、これはコントローラーとそのメソッドに関するXMLドキュメントとして表示される。また、大規模なアプリケーションの場合、RESTメソッドをコントローラークラスに分離するという自然な構成が失われる。
パフォーマンスに関してもいくつかの利点がある。MicrosoftのDaniel Roth氏は次のように述べている。
これらの新しいルーティングAPIは、コントローラーベースのAPIよりもはるかにオーバーヘッドが少ない。新しいルーティングAPIを使うと、ASP.NET CoreはTechEmpower JSONベンチマークで最大800k RPSを達成できる。それに対して、MVCでは最大500k RPSであった。