貧血ドメインモデルと関心の分離に関するいくつかの質問を読みました。貧血のドメインオブジェクトでドメインロジックを実行/アタッチするための最良のテクニックは何ですか?私の仕事では、かなり貧血のモデルがあり、現在、ドメインオブジェクトでデータベース/ビジネスロジックを実行するために「ヘルパー」クラスを使用しています。例えば:
public class Customer
{
public string Name {get;set;}
public string Address {get;set;}
}
public class Product
{
public string Name {get;set;}
public decimal Price {get;set;}
}
public class StoreHelper
{
public void PurchaseProduct(Customer c, Product p)
{
// Lookup Customer and Product in db
// Create records for purchase
// etc.
}
}
アプリが購入を行う必要がある場合、StoreHelperを作成し、ドメインオブジェクトのメソッドを呼び出します。私にとって、Customer / Productが自分自身をリポジトリに保存する方法を知っていることは理にかなっていますが、ドメインオブジェクトにSave()メソッドは必要ないでしょう。Customer.Purchase(Product)のようなメソッドでも意味がありますが、それはエンティティにドメインロジックを配置します。
これが私が出くわしたいくつかのテクニックですが、どれが良いか悪いかわかりません:
- CustomerとProductは、基本的なCRUD操作を一般的な方法で提供する「Entity」クラスから継承します(ORMを使用する場合もあります)。
- 長所:各データオブジェクトは自動的にCRUD操作を取得しますが、データベース/ORMに関連付けられます
- 短所:これは、オブジェクトのビジネスオペレーションの問題を解決せず、すべてのドメインオブジェクトを適切でない可能性のあるベースエンティティに関連付けます。
- ヘルパークラスを使用して、CRUD操作とビジネスロジックを処理します
- 「純粋なデータベース」操作用にDAOを用意し、よりビジネス固有の操作用に個別のビジネスヘルパーを用意することは理にかなっていますか?
- これには、非静的または静的ヘルパークラスを使用する方がよいでしょうか。
- 長所:ドメインオブジェクトはデータベース/ビジネスロジックに関連付けられていません(完全に貧血)
- 短所:あまりOOではなく、アプリケーションコードでヘルパーを使用するのはあまり自然ではありません(Cコードのように見えます)
- エンティティが任意のリポジトリに保存するメソッドを持っている場合は、ダブルディスパッチ手法を使用します
- 長所:関心の分離の改善
- 短所:エンティティにはいくつかの追加のロジックがアタッチされています(ただし、分離されています)
- C#3.0では、拡張メソッドを使用して、ドメインオブジェクトに触れずにCRUD/ビジネスメソッドをドメインオブジェクトにアタッチできました。
- これは有効なアプローチですか?長所/短所は何ですか?
- 他のテクニック?
これを処理するための最良のテクニックは何ですか?私はDDDにかなり慣れていません(私はエバンスの本を読んでいます-それでおそらくそれは私の目を開くでしょう)