Slide 1

Slide 1 text

#dotnetconf Minimal API と DI の良い組み合わせ 2022/11/25 .NET Conf Recap Fukuoka Yuta Matsumura

Slide 2

Slide 2 text

#dotnetconf 松村 優大 (Yuta Matsumura) Chief Technical Architect (C#, PHP, Azure) Microsoft MVP (Developer Technologies) #fukuten #devblogradio の中の人 @tsubakimoto_s Currently working for

Slide 3

Slide 3 text

#dotnetconf 本日お話しすること 1. ASP.NET Core Minimal API とは 2. これまでの Web API 開発との違い 3. これから始める Minimal API 4. Minimal API x Dependency Injection 5. .NET 7 の Minimal API の新機能

Slide 4

Slide 4 text

#dotnetconf ASP.NET Core Minimal API とは • ASP.NET Core 6.0 で登場した機能 • 依存関係が最小限の Web API を作成 • ルーティングで構成するエンドポイント定義

Slide 5

Slide 5 text

#dotnetconf ASP.NET Core Minimal API とは • ASP.NET Core 6.0 で登場した機能 • 依存関係が最小限の Web API を作成 • ルーティングで構成するエンドポイント定義

Slide 6

Slide 6 text

#dotnetconf 最小限の依存関係 前提 (.NET 6.0 ~ / ASP.NET Core 6.0 ~) 最小化されたホスティングモデル • Startup.cs が Program.cs に統合された • トップレベルステートメント • global using により using の記述量が減る

Slide 7

Slide 7 text

#dotnetconf #dotnetconf Program.cs

Slide 8

Slide 8 text

#dotnetconf #dotnetconf $ dotnet run info: Microsoft.Hosting.Lifetime[14] Now listening on: http://localhost:5000 info: Microsoft.Hosting.Lifetime[0] Application started. Press Ctrl+C to shut down. info: Microsoft.Hosting.Lifetime[0] Hosting environment: Production info: Microsoft.Hosting.Lifetime[0] Content root path: C:¥Users¥yuta¥...¥MinimalConsole

Slide 9

Slide 9 text

#dotnetconf ルーティングで構成するエンドポイント定義 HTTP メソッド エンドポイント定義 HTTP GET MapGet HTTP POST MapPost HTTP PUT MapPut HTTP DELETE MapDelete など https://learn.microsoft.com/ja-jp/aspnet/core/fundamentals/routing

Slide 10

Slide 10 text

#dotnetconf #dotnetconf Program.cs

Slide 11

Slide 11 text

#dotnetconf これまでの Web API 開発との違い • MVC の構成に合わせて実装する必要あり • Controller クラス (ControllerBase クラス 要継承) • ApiController 属性 : API 用のコントローラーである目印 • Route 属性 : ルーティング構成 リソース数が増えると必要な Controller も増える https://learn.microsoft.com/en-us/aspnet/core/tutorials/min-web-api#differences-between-minimal-apis-and-apis-with-controllers

Slide 12

Slide 12 text

#dotnetconf これから始める Minimal API

Slide 13

Slide 13 text

#dotnetconf Swagger を構成しましょう .NET では Swashbuckle というライブラリを用いることで、 アプリケーションに Swagger を導入することができます。 https://github.com/domaindrivendev/Swashbuckle.AspNetCore

Slide 14

Slide 14 text

#dotnetconf ルーティングで構成するエンドポイント定義 HTTP メソッド エンドポイント定義 HTTP GET MapGet HTTP POST MapPost HTTP PUT MapPut HTTP DELETE MapDelete など https://learn.microsoft.com/ja-jp/aspnet/core/fundamentals/routing

Slide 15

Slide 15 text

#dotnetconf #dotnetconf

Slide 16

Slide 16 text

#dotnetconf #dotnetconf Minimal API (Program.cs) DB (Usersテーブル) DbContext

Slide 17

Slide 17 text

#dotnetconf #dotnetconf データアクセスは 依存関係の解決 (DI) を介する

Slide 18

Slide 18 text

#dotnetconf #dotnetconf

Slide 19

Slide 19 text

#dotnetconf #dotnetconf ▼グルーピング可能

Slide 20

Slide 20 text

#dotnetconf #dotnetconf

Slide 21

Slide 21 text

#dotnetconf #dotnetconf

Slide 22

Slide 22 text

#dotnetconf #dotnetconf

Slide 23

Slide 23 text

#dotnetconf #dotnetconf パラメーターの取得元を 明示したい場合

Slide 24

Slide 24 text

#dotnetconf #dotnetconf API認証

Slide 25

Slide 25 text

#dotnetconf Minimal API x Dependency Injection

Slide 26

Slide 26 text

#dotnetconf “Fat Program.cs” 実際の API では様々なビジネスロジックが登場します。 しかし、これらを Program.cs に書くと複雑になります。 • パラメーターのバリデーション • ログ出力 • データストアの CRUD • 他サービスとの連携 • HTTP レスポンスの構成

Slide 27

Slide 27 text

#dotnetconf Dependency Injection の活用 ビジネスロジック部分は専用のクラスで管理しましょう。 ※単一責任の原則 (SRP) ASP.NET Core では Dependency Injection の仕組みがサポー トされているため、インターフェースで依存関係を構成する ことで、結果的に「テストしやすいAPI」となります。 https://learn.microsoft.com/ja-jp/aspnet/core/fundamentals/dependency-injection

Slide 28

Slide 28 text

#dotnetconf #dotnetconf ▶

Slide 29

Slide 29 text

#dotnetconf #dotnetconf

Slide 30

Slide 30 text

#dotnetconf .NET 7 の Minimal API の新機能 https://learn.microsoft.com/ja-jp/aspnet/core/release-notes/aspnetcore-7.0

Slide 31

Slide 31 text

#dotnetconf Rate Limit Middleware レート制限(時間内のリクエスト試行回数の制限)を ASP.NET Core 単体で構成することが可能となった。 レート制限に達した HTTP リクエストに対しては HTTP 429 (Too Many Requests) のレスポンスを行う。

Slide 32

Slide 32 text

#dotnetconf Minimal API エンドポイントのフィルター エンドポイント前後で処理を 実行することが可能となった。

Slide 33

Slide 33 text

#dotnetconf 配列と文字列値のバインド ヘッダーやクエリ文字列に指定された値を配列にバインドす ることが可能となった。

Slide 34

Slide 34 text

#dotnetconf AsParametersAttribute 引数のバインドをクラスに置き換え可能となった。 ▼

Slide 35

Slide 35 text

#dotnetconf OpenAPI の機能強化 Microsoft.AspNetCore.OpenApi (nuget) を使用すると、 Minimal API のエンドポイントにて OpenAPI 定義を設定する ことが可能となった。

Slide 36

Slide 36 text

#dotnetconf ルートグループ リソース単位で API グルーピングする機能。 グループレベルで認証構成などが可能。

Slide 37

Slide 37 text

#dotnetconf おまけ 開発をラクにするちょっとしたツールたち

Slide 38

Slide 38 text

#dotnetconf dotnet-httprepl コマンドラインで使用する Web API クライアント。

Slide 39

Slide 39 text

#dotnetconf dotnet user-jwts 開発環境で使用する JWT (JSON Web Token) を発行するため のコマンドラインツール。 JWT に関する情報はユーザーシークレットに保管される。

Slide 40

Slide 40 text

#dotnetconf Appendix • .NET Conf での Minimal API セッション • https://www.youtube.com/watch?v=uoVeZzKl6WQ (2021) • https://www.youtube.com/watch?v=HXHwtEjQoyM (2022) • Minimal API サンプルコード • https://github.com/tsubakimoto/dotnetconf-minimal-api-sample • https://github.com/captainsafia/TrainingApi • ドキュメント • https://learn.microsoft.com/ja-jp/aspnet/core/fundamentals/minimal-apis • https://learn.microsoft.com/ja-jp/aspnet/core/release-notes/aspnetcore-7.0 • https://learn.microsoft.com/ja-jp/aspnet/core/web-api/http-repl/ • https://learn.microsoft.com/ja-jp/aspnet/core/security/authentication/jwt-authn

Slide 41

Slide 41 text

#dotnetconf ご清聴ありがとうございました