$30 off During Our Annual Pro Sale. View Details »

Minimal API と DI の良い組み合わせ

Minimal API と DI の良い組み合わせ

.NET Conf Recap Fukuoka での登壇資料です。
https://msdevjp.connpass.com/event/264482/

Yuta Matsumura

November 28, 2022
Tweet

More Decks by Yuta Matsumura

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  7. #dotnetconf
    #dotnetconf
    Program.cs

    View Slide

  8. #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

    View Slide

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

    View Slide

  10. #dotnetconf
    #dotnetconf
    Program.cs

    View Slide

  11. #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

    View Slide

  12. #dotnetconf
    これから始める Minimal API

    View Slide

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

    View Slide

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

    View Slide

  15. #dotnetconf
    #dotnetconf

    View Slide

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

    View Slide

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

    View Slide

  18. #dotnetconf
    #dotnetconf

    View Slide

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

    View Slide

  20. #dotnetconf
    #dotnetconf

    View Slide

  21. #dotnetconf
    #dotnetconf

    View Slide

  22. #dotnetconf
    #dotnetconf

    View Slide

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

    View Slide

  24. #dotnetconf
    #dotnetconf
    API認証

    View Slide

  25. #dotnetconf
    Minimal API x Dependency Injection

    View Slide

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

    View Slide

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

    View Slide

  28. #dotnetconf
    #dotnetconf

    View Slide

  29. #dotnetconf
    #dotnetconf

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  40. #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

    View Slide

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

    View Slide