2

サンプルアプリでデータベースファーストのアプローチを採用しています。POCOクラスはt4テンプレートを介して生成され、データベースから保持するIdentityプロパティを持ちます。ドメイン内のエンティティとして使用する一部のクラスでは、IDのタイプはint、string、Guidになります。

ドメインで生成してリポジトリに渡すことができる文字列またはGUIDのIDに問題はありません。intの場合もそれは可能ですが、SQLデータベースのAUTOINCREMENTオプションを利用したいと思います。

私の質問は次のとおりです。

  1. 誰の責任は、エンティティのIDを生成することです。それはドメインですか、それともリポジトリですか?

  2. リポジトリとドメイン間でIDの同期をどのように行うことができますか?たとえば、ドメイン内の顧客のIDを1000にして、リポジトリに保存するように依頼できます。リポジトリがそれを保存するとき、新しいIDは2000である可能性があります(AUTOINCREMENTオプションが新しいIDを設定します)。これで2つのエンティティが異なり、ドメイン内のCustomerエンティティ(将来の操作のためにキャッシュされると想定)がDepartmentなどの他のエンティティと一緒に使用されると、ドメインで問題が発生する可能性があります。IDが1000のドメインにキャッシュされたエンティティ(Customer )は、SQLデータストアに新しいエンティティとして保存されます。リポジトリは、顧客がキャッシュされているか新規であるかを認識していません。

4

1 に答える 1

2

エンティティの ID を生成する責任は誰にありますか。ドメインですか、それともリポジトリですか。

エンティティの ID は、ドメインによって直接またはクライアント要求を介して割り当てることができます。このタイプの ID は、通常、Guidまたは別の普遍的に一意の値で生成されます。ID はリポジトリによって割り当てられ、増分 ID 列などのデータベース生成 ID を反映することもできます。

リポジトリとドメイン間で ID を同期するにはどうすればよいですか?

エンティティの ID がデータベースで生成された ID 列から供給される場合、ドメインは独自の ID を割り当てるべきではありません。統合 ID を持つ一時エンティティは、最初は ID 値 0 を持ちます。一時エンティティが永続化されると、リポジトリは ID 値を割り当てます。その時点で、ご指摘のとおり、ID 値が変更されたため、新しく永続化されたエンティティ インスタンスのキャッシュされたインスタンスに問題が発生する可能性があります。これらの問題を解決する方法はいくつかありますが、最初からキャッシュ (または他の場所) で一時的なエンティティを参照しないようにしています。これは、エンティティが永続化されるまで多くの場所で参照されないようにすることで、より簡単に実行できます。さまざまな場所で一時的なエンティティ インスタンスを参照することになった場合は、. NET ランタイム ID は、インスタンスの存続期間中同じままです。これを行うには、エンティティを比較する必要がありますobject.ReferenceEqualsGetHashCodeID値チェックの前に、オブジェクトの存続期間中、生成されたハッシュコードをキャッシュする必要があります。

于 2012-12-29T15:15:37.837 に答える