本を読んだ後;私は次のことを理解しました:
1)エンティティは平等を実装し、IDごとに比較する必要があります。 2)値オブジェクトは同等性を実装し、クラスのすべてのプロパティで比較する必要があります。
私は、ポイント2の私の理解が正しいとまだ信じています。ただし、次の理由により、ポイント1について混乱しています。
1)このブロガーは、すべてのエンティティが継承するエンティティ基本クラスの作成について話します: http://enterprisecraftsmanship.com/2014/11/08/domain-object-base-class/ 。したがって、等価比較は基本クラスで定義されているため、すべてのエンティティはIDによる等価を実装します。
2)ここにあるほとんどのエンティティークラスにはIDがあります: https://github.com/nhibernate/nhibernate-core/tree/master/src/NHibernate.DomainModel/Northwind/Entities
3)この質問は、ID属性があることを示唆しているようです: DDDのドメインオブジェクトのIDプロパティ
4)この質問は、エンティティにIDがあってはいけないと主張されているYouTubeビデオ(ポイント1)を指しています。
上記のポイント1〜4は、次のいずれかを示唆しているようです。1)データベースIDを使用します。 2)データベースIDではない別のIDを使用します。 3)IDを使用しません。
私は以下のことを決定しようとしています:
1)エンティティーのスーパークラスを用意します。
または2)すべてのエンティティに(データベースの)IDがある。
または3)ドメインオブジェクトを識別する識別子(データベースIDではない)を導入します。
ドメインモデルを完全に分離しようとしています(データモデルもあります)。
定義により、entitiesはアイデンティティを持っています。
このこと自体は、エンティティオブジェクトにId
プロパティが必要であることを意味するものではありません。エンティティを集計の外で参照または比較する必要がない場合は、実際には必要ありません。
ただし、通常、すべてのエンティティがIDを持つことは理にかなっています。 Idはどこから来たのですか?特別な理由がない限り、アプリケーションではデータベースではなくIDを作成することをお勧めします。 UUID(C#ではGuid
)またはいくつかのカスタムIdGenerator
を使用できます。データベースがId
値をキーとして使用する可能性があるという事実は、ドメインモデルに関する限り、まったくの偶然です。
これは、Entity
基本クラスの問題を残します。作成したくない理由はいくつかあります。
Entity
はドメインの概念ではないため、ドメインオブジェクトをそれに依存させることは理想的ではありません。
Id
もドメインの概念ではないと主張するかもしれません。それを脇に導入する実用的な理由は、アイデンティティisが暗黙のドメインの懸念であると主張します-それ以外の場合は、単に値オブジェクトを使用できます。
Entity
の機能はほとんどありません。 Id
プロパティと、おそらく非常に安定した1行(this.Id == other.Id
)等価チェックはやり過ぎのようです。
そうは言っても、Entity
基本クラスが原因で問題が発生する可能性は非常に低いと思います。したがって、ドメインロジックに集中するのに役立つ場合(たとえば、これがEquals
をオーバーライドすることを忘れないようにすることで、これが等価性チェックの実装方法である場合)、必ずそれを実行してください。