Sharp Architecture のコードを調べています。これまでのところは問題ありませんが、フレームワークに DDD 値オブジェクトを実装する方法を理解するのに問題があります (コードでこれについて言及しているようには見えません)。基本エンティティ クラスとリポジトリ ベースはエンティティのみに使用されると想定しています。フレームワークに値オブジェクトを実装する方法についてのアイデアはありますか?
2 に答える
Sharp Arch では、名前空間 SharpArch.Domain.DomainModel にクラス ValueObject があります。このオブジェクトは BaseObject から継承し、== および != 演算子と Equals() および GetHashCode() メソッドをオーバーライドします。このメソッド オーバーライドは、これら 2 つのメソッドの BaseObject バージョンを呼び出すだけで、GetTypeSpecificSignatureProperties() メソッドを使用して等値比較で使用するプロパティを取得します。
要点は、エンティティの平等はによって決定されるということです
- 参照等価
- 同型?
- IDは同じです
- [DomainSignature] 属性で装飾されたすべてのプロパティの比較
ValueObject の場合、BaseObject の Equals メソッドが使用されます。
- 参照等価
- 同型?
- すべてのパブリック プロパティを比較する
これは少し単純化したものです。github から最新のコードを入手し、上記の 3 つのクラスのコードを自分で読むことをお勧めします。
編集:永続性に関しては、この SO の質問が役立つ場合があります。それ以外は、公式の NH および Fluent NH ドキュメントを参照してください。
値オブジェクトは、基本クラスを必要としない単純なオブジェクトです。(エンティティが基本クラスを持つ唯一の理由は、ID に基づいて同等性を提供するためです)。値オブジェクトの実装は、ドメインの値を表すクラスを作成することを意味します。多くの場合、値オブジェクトは不変であり、同じ型の他の値オブジェクトとの等価性を判断するための等価比較メソッドを提供する必要があります。ここを見てください。