私はドメイン駆動設計 (DDD) の手法を試していますが、まだよく理解していないように感じています。
DDDは、ドメインオブジェクト、永続化のためのリポジトリ、クライアント(プレゼンテーション)用のドメインオブジェクトを組み立てるためのアグリゲータ、ドメインオブジェクトとリポジトリの上の薄い層であるサービス、アグリゲータにビジネスロジック(永続性、セキュリティなどのインフラストラクチャのものではない)を置くことを提案していますトランザクション境界として機能します。
このように言いましょう:
DDD では、ViewController --> SomeService --> {Domain Objects, Repositories, Aggregators}
私の現在の(手続き型)アプローチでは:ViewController --> SomeService --> DAO/Repository
ここで、ViewController は 1 つ以上のサービスと通信して、DAO を使用してデータベースとの間でデータをプル/プッシュします。ドメイン オブジェクトのプロパティでのみ動作するビジネス ロジックが、そのドメイン オブジェクト自体のメソッド内にある場合。最後に、サービスから取得したデータは DTO に集約され、View Layer に表示されます。
したがって、私には両方のアプローチがほとんど同じように見えます。
誰かが私に欠けているものを説明できますか?
PS:質問をよりよく説明するために、さらに情報を追加しています。理論的には、誰もが DDD が「ロジックはドメイン オブジェクトにある必要がある」ことを示唆していると言っています。わかった。実際のシナリオを考えてみましょう。
ShoppingCart アプリケーションで、一部のユーザーが注文を出しました。注文を処理するには、次のすべてのサブタスクを実行する必要があります。
各アイテムの詳細を取得し、合計注文価格を計算します。
配送先住所を取得し、住所確認サービスを使用して確認します
クレジットカードの詳細を検証/認証する
すべての注文関連情報を DB に保存します
したがって、DDDに従って、ロジックを配置します。
List オブジェクトをループする Order オブジェクトでの Order Total 計算。
Address オブジェクトには、BING アドレス検証を呼び出す validate() メソッドがあります。
CreditCard クラスには、いくつかの CCAuthorizationService を呼び出してサードパーティのサービスを使用して承認する authorize() メソッドがあります。
いくつかのリポジトリを使用して、すべての注文内容を DB に保存します。
これらのすべてのステップは、 Order.process() を呼び出すことによってトリガーされます
これが正しい DDD アプローチである場合は? もしそうなら、私たちのドメインオブジェクトはリポジトリと直接やり取りしており、これは関心の分離に違反しているようです.
これが正しい DDD アプローチではない場合、上記のユースケースをどのように設計するのか教えてもらえますか?