BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース PythonとNodeに挑戦するASP.NET Core 6

PythonとNodeに挑戦するASP.NET Core 6

ブックマーク

原文(投稿日:2021/06/07)へのリンク

.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());

上記の行は次のように解釈できる。

  1. パス/api/todosにHttpGetメソッドを登録する
  2. ユーザが承認されていることを要求する
  3. TodoDbContextタイプのDBコンテキストを挿入する
  4. 非同期でデータベースから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であった。

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

BT