CommandModel (コマンドモデル)
アプリケーションの利用者や外部システムが何らかのトリガーで要請を行い、結果を返す「処理の1サイクル」を定義します。 データの登録・更新だけでなく、「複雑なデータ構造をもつ画面の初期表示処理」や「データ集計Excel出力」といった操作もCommand Modelとして定義されます。 関数定義のように、「引数 (Parameter)」 と 「戻り値 (ReturnValue)」 を持ちます。
自動生成されるモジュール
コマンドモデルの定義1個から、以下のモジュールが自動生成されます。 CommandModelは他のモデルと異なり、データ構造や処理の中身(ロジック)は自動生成されません。生成されるのは、フロントエンドとバックエンドをつなぐ「枠組み」です。
1. 処理のインターフェース(バックエンド)
- 処理実装用クラス: 開発者がビジネスロジックを実装するためのクラス(Application Service)。
Executeメソッド: ここに実際の処理を記述します。引数と戻り値の型は、定義時に指定した他のモデル(DataModel, QueryModel, StructureModel)の型が使用されます。
- Web API エンドポイント: コマンドを外部(フロントエンド含む)に公開するための Controller クラス。HTTPリクエストを受け取り、上記の
Executeメソッドを呼び出します。
2. TypeScript APIクライアント
- API呼び出し関数: フロントエンドからこのコマンドを呼び出すための非同期関数。引数と戻り値には、TypeScriptの型定義が適用され、型安全にAPIを呼び出すことができます。
3. 拡張ポイント
Execute: 必ず実装が必要です。具体的なビジネスロジック(DB更新、外部連携、計算など)を記述します。
詳細は リファレンス を参照してください。
設計指針
1. コマンドモデルの粒度
基本的には 「1つのユースケース(ユーザーのアクション)」につき「1つのCommandModel」 を定義します。 例えば、「受注登録ボタンを押す」「月次集計を実行する」「CSVを取り込む」といった操作の一つ一つが CommandModel になります。
DataModelが「名詞(データ)」であるのに対し、CommandModelは「動詞(処理)」であると言えます。
2. 実装パターン
CommandModelの Execute メソッド内では、要件に応じて自由な処理を記述できます。
- DataModelの更新:
- 最も一般的なパターンです。
- 引数で受け取ったデータを元に、DataModelの
Create,Update,Deleteメソッドを呼び出してデータベースを更新します。 - トランザクション管理もここで行います。
- 参照系処理:
- 複雑な計算結果を返すだけの処理や、一時的なデータの変換処理など、DB更新を伴わない処理も定義可能です。
- 外部システム連携:
- 外部APIの呼び出しや、メール送信などもここで実装します。
- 当然、DataModelの更新と組み合わせて実装することも可能です。
3. 引数と戻り値のデータ構造
CommandModel自体はデータ構造を持ちません。 引数や戻り値が必要な場合は、QueryModel、または StructureModel または DataModel(QueryModelが生成されるもののみ) で定義された構造を指定して利用します。
各 Command Model では、引数・戻り値それぞれについて以下のいずれかを指定します。
- 何も定義しない(引数なし)
- 構造体モデル
- クエリモデルの検索条件
- クエリモデルの検索結果