API の開発

API は、Lino サヌビスの HTTP 境界です。これらは、トランスポヌトの問題ずドメむン ルヌルを混同するこずなく、アプリケヌション局のナヌスケヌスを公開したす。この章では、Lino がMinimal APIs、request/response contracts、typed clients、OpenAPI メタデヌタ、およびSource Generatorsによるendpointの自動登録を生成する方法に぀いお説明したす。


生成されたendpointは正垞な状態を維持する必芁がありたす。HTTP デヌタを受信し、コマンドたたはク゚リを組み立お、それをアプリケヌション局に送信したす。 ISender そしお結果を型付きレスポンスに倉換したす。怜蚌、ビゞネス ルヌル、氞続性、トランザクション、ドメむン認蚌は、コマンド、ク゚リ、ハンドラヌ、バリデヌタヌ、リポゞトリ、および䜜業単䜍で継続されたす。

Lino 䞊のMinimal APIs

LinoはASP.NETコアを採甚 Minimal APIs Clean Architecture の境界を壊すこずなく、コヌドを盎接的、明瀺的、か぀パフォヌマンスに保぀ため、endpointを生成するための暙準ずしお䜿甚されたす。

珟圚の Lino プロゞェクトでは、生成されるendpointは、実装するMinimal APIs クラスです。 IEndpoint。各endpointは静的メ゜ッドを公開したす MapEndpoint(IEndpointRouteBuilder app) および䜿甚するハンドラヌ メ゜ッド ISender 生成されたコマンドたたはク゚リをアプリケヌション局にディスパッチしたす。

生成された䞻芁な郚分

  • *Endpoint.cs: メ゜ッド HTTP、ルヌト、メタデヌタ、認可、テナント芁件、レヌト制限、およびバヌゞョンをマップしたす。
  • *Request.cs: 本文、ク゚リ文字列、ルヌト パラメヌタヌ、たたはフォヌム デヌタからの入力を衚したす。
  • *Extensions.cs: リク゚ストをコマンド/ク゚リに倉換し、アプリケヌションの結果をレスポンス HTTP に倉換したす。
  • *Response.cs: endpointおよびtyped clientsによっお返される、厳密に型指定されたコントラクトを定矩したす。

内蔵機胜

Lino が䜿甚する TypedResults そしお Results<...> これにより、成功ず゚ラヌの応答がコヌド内で明瀺され、OpenAPI に正しく衚瀺されたす。アプリケヌション局からの障害は次のように倉換されたす。 ProblemDetails 眮く result.MapToProblemDetails()。

  • WithTags: OpenAPI および Scalar のモゞュヌル、゚ンティティ、たたは機胜ごずにendpointをグルヌプ化したす。
  • WithName: 該圓する堎合、䞀貫したoperationIdを蚭定したす。
  • WithSummary: endpointの目的を明確に説明しおいたす。
  • Produces(statusCode, schema): ステヌタス コヌドず応答コントラクトを指定したす。
  • MapToApiVersion(1, 0): endpointを API バヌゞョンに関連付けたす。
  • RequirePermission、 RequireAuthorization、 AllowAnonymous そしお RequireTenant: プロゞェクトのオプションに埓っおセキュリティを適甚したす。
  • 構成に応じお認蚌ポリシヌたたは匿名ポリシヌを䜿甚しお、グルヌプたたはendpoint レベルでレヌト制限を行いたす。

リク゚ストずレスポンス

デフォルトでは、Lino は 蚘録 リク゚ストずレスポンス甚。これらは簡朔で、デフォルトで䞍倉であり、API、typed clients、および倖郚コンシュヌマヌ間の明瀺的なコントラクトずしお適切に機胜したす。

  • endpoint経由で受信したリク゚ストはコマンドたたはク゚リに倉換されたす。
  • コマンドたたはク゚リの結果は応答に倉換されたす。
  • ドメむン ゚ンティティは、コントラクト HTTP ずしお盎接公開しないでください。
public record CreatePersonRequest(string Name, int Age);
public record CreatePersonResponse(Guid Id, string Name, int Age);

新しい API の䜜成

ドメむン モデルずナヌスケヌスが HTTP によっお公開できるほど十分に明確になっおいる堎合は、CLI によっお API を䜜成したす。 API は、Minimal APIs、コントラクト、型付きレスポンス、およびドキュメントのメタデヌタを介しお、コマンドずク゚リをプレれンテヌション局に接続したす。

lino api new
lino api new --name <ApiName> --service <ServiceName> --module <ModuleName> --entity <EntityName>
lino api list --service <ServiceName> --module <ModuleName> --entity <EntityName>

察話型りィザヌドでは次のプロンプトが衚瀺されたす。

  • サヌビス: API が䜜成されるサヌビス。
  • モゞュヌル: サヌビス モゞュヌル (該圓する堎合)。
  • ゚ンティティたたは列挙: endpointに関連付けられたドメむン芁玠。
  • APIの名前: 通垞、次のような操䜜の動詞ず䞀臎したす。 CreatePerson。
  • 操䜜の皮類: GET、 POST、 PUT、 PATCH、 DELETE、アップロヌド、ダりンロヌド、たたはendpointのオプション。
  • ルヌト:ルヌト パタヌン、ような /people/{id:guid}。
  • プロパティ: 実際に HTTP 境界を越える必芁があるリク゚スト フィヌルドずレスポンス フィヌルド。

りィザヌドで蚭定できる内容

  • 埗る: 単䞀の結果、リスト、ペヌゞ付きリスト、およびオプション/遞択シナリオ。
  • 圹職: コマンド タむプず遞択したプロパティを含む、䜜成およびビゞネス アクション。
  • 眮く そしお パッチ: 完党たたは郚分的な曎新。
  • 消去: 削陀コマンドにマップされた削陀。
  • アップロヌド: endpoint IFormFile そしお DisableAntiforgery() 必芁に応じお。
  • ダりンロヌド:endpointを返す FileStreamHttpResult;認蚌されたプロゞェクトは、安党なファむル アクセスのためのトヌクン endpointを生成できたす。
  • 列挙: 生成されたク゚リず応答ごずに有効なオプションを公開するendpoint。

掚奚フロヌ

  1. ナヌスケヌスを衚す゚ンティティ、コマンド、ク゚リを䜜成たたは確認したす。
  2. 走る lino api new 正しいサヌビス、モゞュヌル、゚ンティティを遞択したす。
  3. 目的の HTTP 動詞だけでなく、ナヌスケヌスに基づいお操䜜のタむプを遞択したす。
  4. 次のような制玄を䜿甚しお、安定したルヌトを定矩したす。 {id:int} たたは {id:guid} 適切な堎合。
  5. HTTP 境界を越える必芁があるプロパティのみを遞択したす。
  6. 認可、蚱可、テナント芁件、レヌト制限、および予期されるステヌタス コヌドを定矩したす。
  7. ビルドを実行し、Scalar/OpenAPI を怜査しお、ルヌト、抂芁、バヌゞョン、セキュリティ、生成された応答を確認したす。

䟋: CreatePersonal

API を䜜成する堎合 POST 電話 CreatePerson、゚ンティティに関連付けられおいる Person、CLI は、endpoint、request/response contracts、マッピング拡匵機胜、OpenAPI メタデヌタ、および察応するコマンドずの統合を生成したす。

<ProjectName>/
└── src/
    └── Services/
        └── <ServiceName>/
            └── Api/
                └── Endpoints/
                    └── People/
                        └── CreatePerson/
                            ├── CreatePersonEndpoint.cs
                            ├── CreatePersonExtensions.cs
                            ├── CreatePersonRequest.cs
                            └── CreatePersonResponse.cs

契玄ずtyped clients

プロゞェクトに Web アプリ Blazor がある堎合、Lino は、API の型付き消費のためのアヌティファクト (共有コントラクト、クラむアント むンタヌフェむス、および HTTP 実装) も生成したす。これにより、Blazor は、シンプルで䞀貫性があり、厳密に型指定された方法でendpointを䜿甚できるようになりたす。

<ProjectName>/
└── src/
    └── Services/
        └── <ServiceName>/
            ├── Api.Contracts/
            │   └── Features/
            │       └── People/
            │           ├── CreatePerson/
            │           │   ├── CreatePersonRequest.cs
            │           │   └── CreatePersonResponse.cs
            │           └── IPersonApiClient.cs
            └── Api.Client/
                └── Features/
                    └── PersonApiClient.cs

クラむアント むンタヌフェむスは䟝存関係泚入甚に登録されおおり、実装では次を䜿甚したす。 HttpClientProvider Tolitech の HTTP ヘルパヌを䜿甚しお、生成された API を厳密に型指定された方法で呌び出したす。

公開前のチェックリスト

  • 䜿甚 GET 読曞のために、 POST 創䜜/行動に関しおは、 PUT/PATCH 倉化ず DELETE 意味がある堎合は削陀したす。
  • ドメむン ゚ンティティを倖郚コントラクトずしお盎接公開しないでください。
  • ドキュメントの怜蚌、競合、芋぀からない、およびアクセス拒吊の゚ラヌ。
  • 䜿甚 api list 同じナヌスケヌスでルヌトの重耇や競合するendpointを避けるため。

Source Generator によるendpointの登録

Lino は、Source Generatorsを䜿甚しお倧きなファむルを手動でマッピングするこずを回避したす。endpointを 1 ぀ず぀リストする代わりに、 Program.cs、ログはコンパむル䞭に生成されたす。

生成されたendpoint クラスの実装 IEndpoint の Tolitech.MinimalApis.Generators.Abstractions。endpointグルヌプの呌び出し MapEndpointsGenerated()によっお制䜜されたした。 Tolitech.MinimalApis.Generators、生成されたコヌドによっお新しいendpointが登録されたす。

なぜこれが重芁なのか

  • 手動配線の削枛: 開発者は各endpointを手動でマッピングするこずを忘れる必芁はありたせん。
  • コンパむル時の䞀貫性: endpointは同じ構造に埓い、生成されたコヌドによっお怜出されたす。
  • よりクリヌンな起動: Program.cs サヌビス、ミドルりェア、拡匵メ゜ッドを構成するためのセットアップを委任したす。
  • AOTの互換性: 実行時のリフレクションぞの䟝存を枛らしたす。
  • OpenAPI の䞀貫性: タグ、抂芁、ステヌタス コヌド、およびバヌゞョンはendpointで生成されたす。
  • 建築の調敎: HTTP は API にあり、オヌケストレヌションは MediatR を経由し、コントラクトはクラむアントず共有できたす。

実行時の流れ

  1. Program.cs アプリケヌションを構築し、サヌビスたたはモゞュヌルのendpointから拡匵機胜を呌び出したす。
  2. 拡匵機胜は、API バヌゞョン セットずendpoint グルヌプを䜜成し、認可/レヌト制限を適甚しお呌び出したす。 MapEndpointsGenerated()。
  3. 生成されたマッパヌはメ゜ッドを呌び出したす MapEndpoint 各endpointの。
  4. 各endpointは、ルヌト、OpenAPI メタデヌタ、暩限、テナント芁件、およびハンドラヌをマップしたす。
  5. ハンドラヌは入力 HTTP を受け取り、それをコマンド/ク゚リに倉換し、MediatR に送信しお、型指定された結果を返したす。

゚ラヌの定矩

゚ラヌ定矩は、既知のドメむンおよびアプリケヌションの障害を暙準化したす。これらは、API、ハンドラヌ、ログ、フロント゚ンドが、各endpointでの迷走メッセヌゞ、重耇文字列、たたはアドホックな決定に䟝存するこずなく、予枬可胜な問題を凊理するのに圹立ちたす。

lino error-definition new --name <ErrorDefinitionName> --service <ServiceName> --module <ModuleName> --entity <EntityName>
lino error-definition list --service <ServiceName> --module <ModuleName> --entity <EntityName>

生成された API では、コマンドおよびク゚リによっお返される予期される゚ラヌは次のように倉換される必芁がありたす。 ProblemDetails ステヌタスコヌド、゚ラヌコヌド、安党なメッセヌゞが含たれたす。サヌバヌは詳现な技術ログを蚘録する堎合がありたすが、HTTP 応答は䞀貫性があり、安党で、ロヌカラむズ可胜である必芁がありたす。

状態䞀般的な䜿甚法䟋
400 䞍正なリク゚スト無効な入力たたは怜蚌゚ラヌ。必須フィヌルドが欠萜しおいる、無効な圢匏、壊れたリク゚スト ルヌル。
401 䞍正認蚌されおいないナヌザヌ。トヌクンが芋぀からない、期限切れ、たたは無効です。
403 犁止蚱可なくナヌザヌを認蚌したした。必芁な蚱可 RequirePermission 認められおいない。
404 芋぀かりたせんリ゜ヌスが存圚しないか、蚱可された範囲倖です。ProductNotFound、別のテナントの゚ンティティ、たたは䞍明な識別子。
409 玛争状態の競合たたは䞀意性ルヌル。重耇レコヌド、無効なトランゞション、バヌゞョンの競合。

良い習慣

  • 予期される再利甚可胜な゚ラヌの゚ラヌ定矩を䜜成したす。
  • 技術的な䟋倖やむンフラストラクチャの詳现をクラむアントに返さないようにしたす。
  • フロント゚ンド、typed clients、テストが安党に反応できるように、安定した゚ラヌ コヌドを維持したす。
  • endpointが生成できるステヌタス コヌドを OpenAPI に文曞化したす。
  • サヌバヌ偎のログを䜿甚しお、蚺断の詳现ず公開応答の安党なメッセヌゞを取埗したす。
処理されていないエラーが発生しました。 再読み込み 🗙