ASP.NET Core 10.0 の新しいWeb API開発手法
ASP.NET Core 10.0では、Web API開発において従来のController-basedアプローチとMinimal APIという2つの選択肢が提供されています。Microsoft Learn ドキュメントによると、Controller-basedアプローチではControllerBaseから派生したクラスを使用し、リクエストごとにコントローラーがアクティベート・破棄される仕組みになっています。
一方、Minimal APIは依存関係を最小限に抑えたHTTP API作成を目的としており、マイクロサービスや最小限のファイル・機能・依存関係のみを含むアプリケーションに適しています。
(出典: Create web APIs with ASP.NET Core)
Controller-based APIの実装パターン
Controller-basedアプローチでは、標準的なCRUD操作を以下のAPIエンドポイントで実装します。
GET /api/todoitems- 全てのTo-doアイテムを取得GET /api/todoitems/{id}- IDによる特定アイテムの取得POST /api/todoitems- 新しいアイテムの追加PUT /api/todoitems/{id}- 既存アイテムの更新DELETE /api/todoitems/{id}- アイテムの削除
アーキテクチャ設計では、クライアントからのリクエストがコントローラーに送信され、コントローラーとデータアクセス層間で読み書き操作が実行されます。モデルはシリアライズされてレスポンスとしてクライアントに返されます。
(出典: Tutorial: Create a controller-based web API with ASP.NET Core)
Minimal APIの軽量実装
Minimal APIでは、より簡潔な記述でAPIを実装できます。基本的なAPIエンドポイントに加えて、以下の拡張エンドポイントも提供されます。
GET /todoitems/complete- 完了済みTo-doアイテムの取得PATCH /todoitems/{id}- アイテムの部分更新
実装例として、以下のような簡潔なコードでAPIを定義できます:
var app = WebApplication.Create();
app.MapGet("/people", () => new[]
{
new Person("Ana"), new Person("Filipe"), new Person("Emillia")
});
app.Run();
record Person(string Name);
この実装により、curlコマンドで[{"name":"Ana"},{"name":"Felipe"},{"name":"Emillia"}]のようなJSONレスポンスを取得できます。
(出典: Tutorial: Create a Minimal API with ASP.NET Core)
OpenAPI統合の変更点
ASP.NET Core 9.0以降では、OpenAPIサポートが組み込まれ、Swashbuckleがデフォルトから置き換えられました。Swashbuckleはプロジェクトテンプレートに含まれなくなりましたが、コミュニティパッケージとして手動で追加することは可能です。
従来のSwagger/OpenAPI実装では、openapi.json仕様書がAPIの機能を記述し、SwaggerUIなどのツールを駆動していました。新しい組み込みOpenAPIサポートでは、対話的な探索やローカルでのアドホックテストにSwagger UIを使用できます。
ASP.NET Core 8.0以前のプロジェクトでSwashbuckleやNSwagを使用している場合は、従来の実装が引き続き利用可能です。
(出典: ASP.NET Core web API documentation with Swagger / OpenAPI)
まとめ
- ASP.NET Core 10.0のController-basedアプローチを使用して、
ControllerBase派生クラスで標準的なCRUD操作APIを実装できる - Minimal APIパターンを採用することで、マイクロサービス向けの軽量なHTTP APIを
WebApplication.Create()とMapGetメソッドで簡潔に構築できる - 組み込みOpenAPIサポートにより、Swashbuckle依存なしでAPI仕様書生成とSwagger UI統合を実現できる
- Entity Framework Core InMemoryプロバイダーを
Microsoft.EntityFrameworkCore.InMemoryNuGetパッケージで追加し、データベース操作をメモリ内で実行できる