Evans、Nilsson、McCarthy などを読み、ドメイン駆動設計の背後にある概念と理由を理解しています。ただし、これらすべてを実際のアプリケーションにまとめるのは難しいと感じています。完全な例がないため、頭を悩ませています。多くのフレームワークと簡単な例を見つけましたが、これまでのところ、DDD に従って実際のビジネス アプリケーションを構築する方法を実際に示したものはありません。
一般的な注文管理システムを例に、注文キャンセルの場合を考えてみましょう。私のデザインでは、注文番号と理由をパラメーターとして受け入れる CancelOrder メソッドを持つ OrderCancellationService を見ることができます。次に、次の「手順」を実行する必要があります。
- 現在のユーザーが注文をキャンセルするために必要な権限を持っていることを確認します
- OrderRepository から、指定された注文番号の Order エンティティを取得します
- 注文がキャンセルされる可能性があることを確認します (サービスは注文の状態を調べてルールを評価する必要がありますか? または、注文にルールをカプセル化する CanCancel プロパティが必要ですか?)
- Order.Cancel(reason) を呼び出して、Order エンティティの状態を更新します。
- 更新された注文をデータ ストアに保持する
- CreditCardService に連絡して、処理済みのクレジット カード請求を元に戻す
- 操作の監査エントリを追加します
もちろん、これはすべてトランザクション内で発生する必要があり、どの操作も独立して発生することは許可されません。つまり、注文をキャンセルした場合、クレジット カード取引を元に戻す必要があります。キャンセルすることはできず、この手順を実行しません。これは、imo、より良いカプセル化を示唆していますが、ドメイン オブジェクト (Order) の CreditCardService に依存したくないので、これはドメイン サービスの責任のようです。
これをどのように「組み立てる」ことができるか/すべきかのコード例を見せてくれる人を探しています。コードの背後にある思考プロセスは、すべての点を自分で結び付けるのに役立ちます。どうも!