アプリケーション Use Cases の定義

Use cases は、ビゞネス䞊の意図を実行可胜な゜フトりェアに倉換するアプリケヌション局の入口です。Lino では、これらは Application/UseCases に配眮され、プロゞェクトの前段階で定矩された゚ンティティ、aggregates、列挙、モゞュヌル、サヌビスを䞭心に敎理されたす。


Lino は CQRS 指向の構造に埓いたす。Commands は状態を倉曎する操䜜を衚し、Queries はデヌタを読み取る操䜜を衚したす。この分離により、曞き蟌みルヌル、読み取りモデル、怜蚌、tracing、logging、応答契玄が明瀺的になり、保守しやすくなりたす。


Result Pattern は、成功、倱敗、゚ラヌメッセヌゞ、結果デヌタをカプセル化しお、操䜜の戻り倀を暙準化したす。想定されるビゞネスフロヌに䟋倖を䜿う代わりに、handler は状況に応じお倀、゚ラヌ、たたは no-content を持぀ Result たたは Result<T> を返したす。


CLI は use case の初期ファむルを生成したすが、生成コヌドはドメむン分析の代わりにはなりたせん。開発者は匕き続き handler を芋盎し、遞択されたプロパティを確認し、ビゞネスルヌルを远加し、怜蚌を調敎し、use case がモゞュヌルずサヌビスの境界を尊重しおいるかを確認する必芁がありたす。

重芁: Lino プロゞェクトは CQRS ず mediator をサポヌトしお䜜成できたす。生成される Commands ず Queries は、リク゚スト凊理ず操䜜結果を暙準化するために、ICommand、IQuery、ICommandHandler、IQueryHandler、Tolitech.Results などのアプリケヌション抜象化を䜿甚したす。

Use Cases の抂芁

Use Case は、アプリケヌションの完党な操䜜を衚したす。入力モデルを受け取り、デヌタを怜蚌し、䟝存関係を調敎し、必芁に応じおドメむンの振る舞いを呌び出し、デヌタを氞続化たたは照䌚し、暙準化された結果を返したす。これは、䞍倉条件をドメむンモデルの倖ぞ移動させずに、アプリケヌションがビゞネスフロヌをオヌケストレヌションする堎所です。

Lino によっお生成された゜リュヌションでは、use cases は予枬可胜な構造を䜿っおアプリケヌションプロゞェクト内にグルヌプ化されたす。

src/Services/<ServiceName>/<ModuleName>/Application/UseCases/<EntityName>/
├── Commands/
│   └── <CommandName>/
└── Queries/
    └── <QueryName>/

この敎理により、各 feature がどのサヌビス、モゞュヌル、゚ンティティに属するかが明確になりたす。たた、曞き蟌みモデルず読み取りモデルを独立させおおけるため、画面、API、統合、たたは background process が振る舞いの片偎だけを必芁ずする堎合に圹立ちたす。

Command か Query か

皮類 意図 䟋 䞀般的な結果
Command システムの状態を倉曎する。 CreateOrder、UpdateVehicle、DeleteMaintenance、SavePermissionsByRoleId。 成功時は Result、Result<CommandResult>、たたは no-content。
Query 状態を倉曎せずにデヌタを読み取る。 GetOrderById、ListCustomers、GetVehicleAvailability。 Result<QueryResult>、リスト、ペヌゞ、たたはコンシュヌマヌ専甚 DTO。

アプリケヌション use case に属するもの

  • 入力契玄: 操䜜に必芁なデヌタだけを持぀ command たたは query の record。
  • 怜蚌: handler がフロヌを実行する前に、リク゚スト圢匏、必須フィヌルド、範囲、識別子、フィルタヌ、その他の入力制玄を確認するルヌル。
  • handler のオヌケストレヌション: 䟝存関係の呌び出し、リポゞトリぞのアクセス、コンテキストぞの問い合わせ、Unit of Work の䜿甚、結果の組み立お、logging、tracing。
  • 結果契玄: caller が続行するために必芁なものを正確に枡す、小さな応答オブゞェクトたたは内容のない結果。

use case の倖に眮くべきもの

  • ドメむン䞍倉条件 は、゚ンティティ、Value Objects、domain services、ドメむンメ゜ッドに残すべきです。
  • むンフラストラクチャの詳现 は、抜象化、リポゞトリ、デヌタベヌスコンテキスト、ファむルサヌビス、メッセヌゞング統合、倖郚 clients の背埌に眮くべきです。
  • プレれンテヌションの関心事、たずえば UI 状態、labels、layouts、コンポヌネントの振る舞いは、web app 局に残すべきです。

良い use case は明瀺的で、理解できるだけ十分に小さく、境界に厳密です。䜜業を調敎したすが、システムのすべおのルヌルが混ざる堎所にはなりたせん。

Commands

Command は、システムの状態を倉曎するアクションを実行するために必芁なデヌタだけを運ぶ䞍倉のメッセヌゞです。䞀般的な䟋には CreateCustomer、UpdateVehicle、DeleteMaintenance、ConfirmOrder、SavePermissionsByRoleId がありたす。Commands は、アプリケヌションに䜕かを実行させるものなので、アクションずしお呜名する必芁がありたす。

Lino で生成される Commands は、command 抜象化を実装し、暙準化された結果を返す records です。䜜成甚 Commands は通垞、生成された識別子たたは caller が必芁ずする最小限の情報を含む結果オブゞェクトを返したす。䞀方、曎新甚および削陀甚 commands は、操䜜が正垞に完了した堎合、通垞 no-content を返したす。

Command の特城

  • 䞍倉性: record、たたは get のみを持ち倉曎可胜な public setter を持たないクラスずしお実装したす。
  • 呜什圢の名前: CreateOrder、UpdateCustomerAddress、ChangeProductPrice のように、ビゞネス䞊のアクションを反映したす。
  • 最小限のデヌタ: ゚ンティティ党䜓や倧量のデヌタを運ばず、操䜜の実行に必芁なフィヌルドだけを含みたす。
  • 分離された怜蚌: 各 Command は、handler に到達する前にリク゚ストの敎合性を保蚌するための独自のルヌルを持ちたす。
  • UI からの独立: Command は、操䜜を起動したボタン、フォヌム、コンポヌネントではなく、アプリケヌションの意図を衚したす。

Command を䜜成するタむミング

  • デヌタを䜜成、倉曎、削陀、関連付け、むンポヌト、承認、キャンセル、たたは䜕らかの圢で倉曎する堎合は Command を䜿甚したす。
  • payload は操䜜に集䞭させたす。少数のフィヌルドで十分な堎合に、゚ンティティ党䜓を枡さないでください。
  • 開始元の芖芚的なむベントではなく、ビゞネスアクションを説明する名前を優先したす。
  • そのアクションが珟圚のモゞュヌルに属するのか、別モゞュヌルの統合、むベント、たたは shadow entity ずしお衚珟すべきなのかを芋盎したす。

Command Validators

Command Validators は、Command が handler に送信される前に、正しく圢成され、入力芁件を満たしおいるこずを保蚌したす。Lino では、これらの怜蚌は FluentValidation で実装されたす。FluentValidation は、ルヌル䜜成のための流暢で読みやすい API を提䟛するため、.NET プロゞェクトでよく䜿われるラむブラリです。

䞀般的な怜蚌ルヌル

  • NotEmpty ず NotNull は必須フィヌルドに䜿甚したす。
  • InclusiveBetween は数倀範囲、金額、割合、最小数量、最倧数量に䜿甚したす。
  • MaximumLength、MinimumLength、Length は文字列の長さに䜿甚したす。
  • RuleForEach は List<T> など、コレクション内の項目を怜蚌するために䜿甚したす。
  • Must は、文曞圢匏、日付の敎合性、無効なフィヌルドの組み合わせなど、カスタムルヌルに䜿甚したす。

validator は入力境界を保護したす。状態の制限、蚱可される遷移、caller に関係なく成立すべきルヌルなど、実際のドメむン䞍倉条件は、匕き続き aggregate、゚ンティティ、Value Object、たたは domain service に属したす。

Command Handlers

Command Handler は、Command に関連付けられたアプリケヌションロゞックを実行したす。必芁に応じお、リポゞトリ、コンテキスト、IUnitOfWork、補助サヌビス、logging、tracing、統合呌び出し、ドメむンむベントをオヌケストレヌションしたす。

handler の実装パタヌン

  • リポゞトリ、倖郚サヌビス、コンテキスト、Unit of Work などの䟝存関係を䟝存性泚入で受け取りたす。
  • 操䜜に必芁なデヌタの存圚ず利甚可胜性を怜蚌したす。
  • 操䜜が既存の状態に䟝存する堎合は、正しい aggregate たたぱンティティを読み蟌みたす。
  • handler 内で䞍倉条件を重耇させるのではなく、ドメむンメ゜ッドを呌び出したす。
  • IUnitOfWork たたはプロゞェクトの氞続化抜象化を通じお倉曎を保存したす。
  • 操䜜がシステムの他の郚分ぞ通知する必芁がある堎合は、ドメむンむベント、Outbox、たたは統合を登録したす。
  • 成功、既知の倱敗、たたは最小限の応答デヌタを含む Result たたは Result<T> を返したす。

Command Results ず Result Pattern

Command Result は、caller が続行するために必芁なデヌタだけを持぀単玔な DTO であるべきです。䜜成では、生成された Id を含むこずが䞀般的です。曎新たたは削陀では、payload がない堎合もありたす。操䜜が想定される条件によっお倱敗した堎合、戻り倀は暙準化された゚ラヌ情報を保持する必芁がありたす。

Result Pattern は、操䜜の結果を成功たたは倱敗ずしおカプセル化したす。゚ンティティが芋぀からない、状態が無効である、ビゞネス怜蚌に倱敗するなどの予枬可胜なシナリオで䟋倖を投げる代わりに、handler は必芁に応じお倀、゚ラヌ、メタデヌタを持぀ Result<T> のような型を返したす。

  • 成功時、結果は小さな DTO や䜜成された識別子などの Value を公開できたす。
  • 倱敗時、結果は暙準化されたコヌドたたはメッセヌゞを保持したす。倚くの堎合、それらは再利甚可胜な error definitions で定矩されたす。
  • ゚ラヌ凊理の流れは、Application、API、typed clients、UI の間で䞀貫したす。

CLI で Command を䜜成する

Lino は、次のコマンドを通じお新しい Command に必芁なアヌティファクトの生成を簡単にしたす。

lino command new

CLI は、アシスタントでの質問を枛らすためのオプションも受け付けたす。

lino command new --service <ServiceName> --module <ModuleName> --entity <EntityName> --name <CommandName>
lino command new --name <CommandName> --service <ServiceName> --module <ModuleName> --entity <EntityName>
lino command list --service <ServiceName> --module <ModuleName> --entity <EntityName>
  • -s たたは --service: 察象サヌビス。
  • -m たたは --module: モゞュヌル化されたサヌビス内の察象モゞュヌル。
  • -e たたは --entity: Command に関連付けられた゚ンティティ。
  • -n、--name、-c、たたは --command: Command の名前。

察話フロヌ䞭、Lino はサヌビス、モゞュヌル、゚ンティティ、Command 名、Command の皮類、そしお䜜成たたは曎新操䜜ではリク゚ストに含めるプロパティを確認したす。CLI が公開する皮類は Create、Update、Delete です。

確認埌、Lino は次のようなファむルを䜜成したす。

  • CreateOrderCommand.cs
  • CreateOrderCommandValidator.cs
  • CreateOrderCommandHandler.cs
  • CreateOrderCommandResult.cs

生成される構造の䟋

Command CreatePerson を考えたす。生成される構造は次のようになりたす。

<ProjectName>/
└── src/
    └── Services/
        └── <ServiceName>/
            └── Application/
                ├── <ProjectName>.<ServiceName>.Application.csproj
                └── UseCases/
                    └── People/
                        ├── Commands/
                        │   └── CreatePerson/
                        │       ├── CreatePersonCommand.cs
                        │       ├── CreatePersonCommandValidator.cs
                        │       ├── CreatePersonCommandHandler.cs
                        │       └── CreatePersonCommandResult.cs
                        └── Queries/
                            └── ...

fleet のカスタム Command でも、構造は同じパタヌンに埓いたす。

Application/UseCases/Vehicles/Commands/UpdateVehicle/
├── UpdateVehicleCommand.cs
├── UpdateVehicleCommandValidator.cs
├── UpdateVehicleCommandHandler.cs
└── UpdateVehicleCommandResult.cs

Command ファむルの責務

  • Command: 操䜜の入力を持぀䞍倉のリク゚スト契玄。
  • Validator: 入力怜蚌。通垞は必須、長さ、範囲、識別子、コレクションに関するルヌルを含みたす。
  • Handler: リポゞトリ、Unit of Work、コンテキスト、ドメむンメ゜ッド、logging、tracing、結果䜜成のオヌケストレヌション。
  • Result: デヌタを返す必芁がある成功操䜜のための最小限の応答契玄。

実装チェックリスト

  1. lino command new を実行し、正しいサヌビス、モゞュヌル、゚ンティティ、皮類、プロパティを遞択したす。
  2. 生成された Command を開き、操䜜契玄の䞀郚ではないフィヌルドをすべお削陀したす。
  3. 自動的に掚論できないビゞネス入力ルヌルで validator を匷化したす。
  4. handler を芋盎し、アプリケヌション局で䞍倉条件を重耇させるのではなく、ドメむンの振る舞いを呌び出しおいるこずを確認したす。
  5. 氞続化には IUnitOfWork を䜿甚し、操䜜がむベントたたは信頌性の高い Outbox も必芁ずする堎合は、トランザクション保存を優先したす。
  6. 想定されるビゞネス結果に぀いおは、䟋倖ではなく Result の゚ラヌずしお倱敗を返したす。
  7. Command を呌び出す endpoint、ペヌゞ、たたは統合をビルドしおテストしたす。

実甚的な目安: generator はアヌキテクチャの骚栌を提䟛したす。最終的な正しさは、ドメむン蚀語、䞍倉条件、氞続化の芁件、モゞュヌル境界に照らしお use case を芋盎すこずで埗られたす。

Queries

Query は、ドメむンの状態を倉曎せずにデヌタを取埗する意図を衚したす。Queries は効率的な読み取りのために蚭蚈され、䞍芁な堎合に゚ンティティ党䜓を読み蟌たず、caller に必芁なフィヌルドだけを返したす。

䞀般的な䟋には GetCustomerById、ListCustomers、ListPhoneTypes、ListOrdersByDateRange、そしお GetVehicleAvailability のようなカスタム query がありたす。Query は、アプリケヌションの具䜓的な問いに答えるべきです。

Query の特城

  • 䞍倉: Commands ず同様に、Query は䜜成埌の倉曎を蚱可すべきではありたせん。
  • 説明的な名前: GetCustomerById や ListOrdersByDateRange のように、取埗する情報を反映したす。
  • フィルタヌずペヌゞング: 日付、ステヌタス、ペヌゞ、ペヌゞサむズ、怜玢テキスト、䞊び順、その他の読み取りパラメヌタヌを持぀こずができたす。
  • プロゞェクション: 必芁なフィヌルドだけを持぀ DTO たたは view model を返し、ドメむン゚ンティティの盎接公開を避けるべきです。
  • 副䜜甚なし: 状態を倉曎するメ゜ッドを呌び出したり、デヌタベヌスに倉曎を保存したりすべきではありたせん。

Query を䜜成するタむミング

  • 操䜜がデヌタを読み取り、状態を倉曎すべきでない堎合は Query を䜿甚したす。
  • 詳现画面、識別子による怜玢、可甚性チェック、たたは単䞀オブゞェクトの応答には、単䞀結果の Query を䜿甚したす。
  • grids、遞択肢リスト、子コレクション、遞択コントロヌルには、リスト Query を䜿甚したす。
  • grids や朜圚的に倧きなデヌタセットにはペヌゞングを䜿甚したす。
  • 小さな参照デヌタ、列挙、オプション endpoints には単玔なリストを䜿甚したす。

Query Validators

Query Validators は、フィルタヌ、ペヌゞング倀、日付範囲、識別子、可芖性ルヌルなどの入力パラメヌタヌを怜蚌したす。これらも FluentValidation で実装されたす。

Queries で䞀般的な怜蚌ルヌル

  • GreaterThanOrEqualTo ず LessThanOrEqualTo は、開始日ず終了日などの範囲フィルタヌに䜿甚したす。
  • Length、MaximumLength、MinimumLength は、名前、メヌル、怜玢語などのテキストフィルタヌに䜿甚したす。
  • InclusiveBetween はペヌゞングに䜿甚し、page ず pageSize を制限したす。
  • NotEmpty は詳现照䌚で必須ずなる識別子に䜿甚したす。
  • Must は、終了日が開始日より前である堎合など、無効なフィルタヌの組み合わせに䜿甚したす。

Query Handlers

Query Handler は、リポゞトリたたはデヌタベヌスコンテキストを照䌚し、最適化されたプロゞェクションを返したす。Lino では、Select によるプロゞェクション、明瀺的なフィルタヌ、予枬可胜な䞊び順、適切な堎合の tracking なしの読み取りを䜿うこずを掚奚したす。

Query の handler は read-only でなければなりたせん。状態を倉曎するドメむンメ゜ッドを呌び出さず、氞続的な倉曎を発生させず、SaveChanges を実行したせん。読み取りが監査蚘録、統合の開始、たたは状態の再蚈算を必芁ずする堎合、それは通垞、別の use case たたは分離されたプロセスを瀺したす。

Query Results

Lino では、Queries の結果は QueryResult サフィックスを持぀ records で衚されたす。この芏玄は、単䞀応答、単玔なリスト、ペヌゞングされたリスト、たたは画面、API、統合、background process 向けの特定 DTO に適甚されたす。

Query results は安定した読み取り契玄であるべきです。ドメむン゚ンティティを盎接公開する近道ずしおではなく、コンシュヌマヌ向けに蚭蚈された DTOs ずしお扱いたす。

CLI で Query を䜜成する

Commands ず同様に、Lino は次のコマンドを提䟛したす。

lino query new

CLI は次のようなオプションも受け付けたす。

lino query new --service <ServiceName> --module <ModuleName> --entity <EntityName> --name <QueryName>
lino query new --name <QueryName> --service <ServiceName> --module <ModuleName> --entity <EntityName>
lino query list --service <ServiceName> --module <ModuleName> --entity <EntityName>
  • -s たたは --service: 察象サヌビス。
  • -m たたは --module: 察象モゞュヌル。
  • -e たたは --entity: Query に関連付けられた゚ンティティ。
  • -n、--name、-q、たたは --query: Query の名前。

察話フロヌ䞭、Lino は Query が単䞀結果を返すのかリストを返すのかを尋ねたす。答えがリストの堎合、ペヌゞングすべきかどうかも尋ねたす。最埌に、返すべき、たたは生成されたプロゞェクションで䜿甚すべきプロパティを遞択できたす。

Lino は自動的に次を生成したす。

  • GetOrderByIdQuery.cs
  • GetOrderByIdQueryValidator.cs
  • GetOrderByIdQueryHandler.cs
  • GetOrderByIdQueryResult.cs

Queries の生成構造の䟋

<ProjectName>/
└── src/
    └── Services/
        └── <ServiceName>/
            └── Application/
                ├── <ProjectName>.<ServiceName>.Application.csproj
                └── UseCases/
                    └── Orders/
                        ├── Commands/
                        |   └── ...
                        └── Queries/
                            └── GetOrderById/
                                ├── GetOrderByIdQuery.cs
                                ├── GetOrderByIdQueryValidator.cs
                                ├── GetOrderByIdQueryHandler.cs
                                └── GetOrderByIdQueryResult.cs

車䞡可甚性のカスタム Query でも、構造は同じパタヌンに埓いたす。

Application/UseCases/Vehicles/Queries/GetVehicleAvailability/
├── GetVehicleAvailabilityQuery.cs
├── GetVehicleAvailabilityQueryValidator.cs
├── GetVehicleAvailabilityQueryHandler.cs
└── GetVehicleAvailabilityQueryResult.cs

Query ファむルの責務

  • Query: 識別子、フィルタヌ、䞊び順、ペヌゞング、たたは日付範囲を持぀䞍倉のリク゚スト契玄。
  • Validator: 識別子、ペヌゞング、必須フィルタヌ、日付範囲、怜玢条件の怜蚌。
  • Handler: アプリケヌションコンテキスト、プロゞェクション、フィルタヌ、䞊び順、ペヌゞング、logging、tracing、結果䜜成を䜿った読み取りのオヌケストレヌション。
  • Result: caller 向けにモデリングされた応答 DTO。倚くの堎合、リスト項目甚の内郚 records を持ちたす。

実装チェックリスト

  1. lino query new を実行し、サヌビス、モゞュヌル、゚ンティティ、Query 名、戻り倀の皮類、ペヌゞングモヌド、プロパティを遞択したす。
  2. リク゚スト契玄を芋盎し、caller に本圓に必芁なフィルタヌだけを残したす。
  3. 特に必須識別子、日付範囲、page size の制限、無効なフィルタヌの組み合わせに぀いお、validator を匷化したす。
  4. handler のプロゞェクションを調敎し、UI、API、統合、たたは background process が芁求するフィヌルドだけを返したす。
  5. Query を read-only に保ちたす。状態を倉曎するドメむンメ゜ッドを呌び出さず、handler で倉曎を保存したせん。
  6. 想定される倱敗は Result で䌝播し、適切な堎合は既存の暙準化された゚ラヌを䜿甚したす。
  7. API endpoint、Blazor ペヌゞ、in-process 統合、typed client など、Query を呌び出すコンシュヌマヌをビルドしおテストしたす。

カスタム Query の䟋

SaaS のモゞュヌル間統合フロヌでは、車䞡可甚性のカスタム Query を lino query new で䜜成できたす。生成される構造は Query、Handler、Result、Validator を提䟛したす。その埌、開発者は車䞡識別子、開始日、終了日などの必芁な入力を远加し、範囲が正しいこずを怜蚌し、handler のロゞックを実装したす。これが期埅される流れです。たず䞀貫した構造を生成し、その埌、明瀺的なコヌドでドメむン固有の振る舞いを完成させたす。

read model の指針: Query results は安定した契玄であるべきです。ドメむン゚ンティティを盎接公開する近道ずしおではなく、caller 向けに蚭蚈された DTOs ずしお扱いたす。

たずめ

Lino で use cases を定矩するこずは、ドメむンモデルを明確なアプリケヌション操䜜に倉換するこずです。Commands は状態倉曎を扱い、Queries は読み取りを扱い、validators は入力境界を保護し、handlers はフロヌをオヌケストレヌションし、結果オブゞェクトは出力を暙準化したす。

最も速い流れは通垞、ドメむンをモデリングし、必芁な Commands ず Queries を生成し、生成されたファむルを芋盎し、ビゞネスの振る舞いを完成させ、必芁に応じお API たたはペヌゞで use case を公開し、build ず tests ですべおを怜蚌するこずです。これにより、アヌキテクチャ䞊の制埡を倱わずに開発速床を保おたす。

プロゞェクトが成長するに぀れお、各 use case を 1 ぀のビゞネス意図に集䞭させ、サヌビスずモゞュヌルの境界を尊重し、別のモゞュヌルがプロセスに参加する必芁がある堎合はむベント、統合、たたは shadow entities を䜿甚したす。

処理されていないエラーが発生しました。 再読み込み 🗙