ドメイン駆動設計を実践しようとしていますが、コードの基本構造には次のオブジェクトが含まれています。
Action->Facade->
Service
Model
Repository
次のように、CRUD メソッドをモデルのどこに配置する必要があると思いますか。
order.save(new order())
または、次のようにファサードに配置します。
addOrderFacade.save(new order())
ドメイン駆動設計を実践しようとしていますが、コードの基本構造には次のオブジェクトが含まれています。
Action->Facade->
Service
Model
Repository
次のように、CRUD メソッドをモデルのどこに配置する必要があると思いますか。
order.save(new order())
または、次のようにファサードに配置します。
addOrderFacade.save(new order())
「保存」または「削除」メソッドは、リポジトリに属します。通常、Save はサービスまたはコマンド ハンドラーによって呼び出されます (コマンド ベースのアプローチを使用してドメインを更新している場合)。Save は CRUD から CU を処理し、D は独自のメソッドを取得します。R の部分は興味深いものです。
R がそれを更新するために 'GetEntity' を意味する場合、保存と同じ場所で処理されるドメイン リポジトリ (複数のリポジトリがあります) の一部にすることができます。
ただし、基本的にユーザーに結果を返すクエリのみを表示するために読み取りたい場合は、クエリ専用の別のリポジトリと、単純化された読み取り専用モデルを使用する必要があります。このレポは、コントローラーまたは UI からも呼び出すことができます。
それらをドメインクラスに入れないことをお勧めします。
ドメイン クラス パッケージは、DAO レイヤーが異なる他のアプリのどこかで再利用できます。そのため、DAO のモデルの上に別のレイヤーを作成することをお勧めします。
慣例では、CRUDメソッドをモデルではなくリポジトリまたはサービスレイヤーに配置します。実際、SpringやHibernateのようなフレームワークを使用する場合は、このアプローチを使用するように誘惑されます。その理由だけで、通常は簡単です。
ただし、設計の観点からは、このアプローチに反対する強い主張があります。それは貧血のドメインモデル、言い換えれば、状態のみを持ち、振る舞い(構造体)を持たないオブジェクトにつながりますが、公平に言えば、オブジェクト指向ではありません。ビュー、コントローラー、サービス、リポジトリの各レイヤーを介して多くのデータを渡す必要があり、状態と動作をまとめるには多くの「オーバーヘッド」コードが必要です。正規のモデルレイヤーに注意を払わないと、チーム間でモデルの不一致や断片化が発生する可能性もあります。
この設計の落とし穴を回避しようとするアプローチは、ドメイン駆動設計と呼ばれることが多く、EricEvansによってそのように定義されています。ウィキペディアのページから、DDD内にサービスとリポジトリの場所がまだあることに注意してください。
興味がある場合は、DDDおよび(すぐ下の)DDDサンプルアプリケーションをサポートするソフトウェアツールを確認してください。