2009-06-18 6 views
5

は、住所子オブジェクトのリストを持つ親オブジェクトの従業員を持つ:リポジトリパターンを使用すると、親オブジェクトと子オブジェクトを一緒に保存するか、別々に保存するのがベストですか?

class Employee 
{ 
    List<Address> addresses; 
} 

とリポジトリ方法:

void Insert(Employee); 

がこのリポジトリ親従業員を保存しようとするだけでなく、内のコード万一子アドレスオブジェクト、または別々のリポジトリで親オブジェクトと子オブジェクトを処理する必要がありますか?

個別のリポジトリの場合、Employeeオブジェクトとその子をクライアントコード内に保存する場合、これはサービスレベルで組み合わされた別の呼び出しか、別の代替手段ですか?

答えて

5

リポジトリは、集約オブジェクト(親とすべての子)全体を処理する必要があります。これがそれをリポジトリにするためです。ルートオブジェクトと子オブジェクトを別々に保存している場合、使用しているパターンは実際にはリポジトリとは呼ばれません(まだ完全に良い解決策かもしれませんが)。

「リポジトリ」は、一括して集約全体をロードして保存する特定のデータアクセスパターン - リポジトリパターンを使用していると他の開発者に言うと、彼らは何が起こっているのかを知っています。

+0

同じ住所の従業員が多数いる場合は、明らかに例外がありますが、 –

0

私は、あなたが開いて変更を加え、コミットした後、正しいことを決める作業単位パターンを試してみることにしました。

リレーショナルデータベースの場合は、テーブルごとにマッパーを持つHibernateのようなものになります。非リレーショナルデータベースの場合は、創造的に取得し、ドメインオブジェクトをIAggregateRootまたは何かにマークして、どのオブジェクトが独自のリポジトリを持っているかを知る必要があります。

たとえば、Employeesが1つのSOAに格納され、Addressesが別のSOAに格納されている場合は、それぞれIAggregateRootsになり、理想的には作業ユニットが自動的に各汚れたインスタンスを対応するリポジトリに保存して保存します。

したがって、クライアントコードには透過的ですが、無用な間接的なレイヤーではありません(サービスは主にJava世界では、必ずしもそうではありませんが、私が見たものです)。

私はDDDが大好きですが、私はDDDが大好きですが、経験豊富な人は、それが正しく機能するかどうかを常に尋ねているため、経験的には多くの混乱を招いています。

SOAベースの既知の複数のバックエンドを持つシステムを持っていない限り、私はいつかAmazonになるかもしれません。私はリポジトリから個人的に恥ずかしがります。 Hibernateベースのマッパー/ DAO /何か、確かに、リポジトリよりも単純で具体的に見えます。

0

私はテーブルごとにリポジトリを好むが、集約リポジトリにそれらを一緒にのり:

public RootEmployeeRepository (
    IEmployeeRepository employeeRepository, 
    IAddressRepository addressRepository) 
{ 
    // init 
} 

public SaveEmployee (Employee employee) 
{ 
    // call IEmployeeRepository to save the employee record minus childen 
    // call IAddressRepository to save employee.addresses 
    // commit all changes to the DB via UnitOfWork 
} 
0

私はNHibernateのを好むカスケードがあなたのために保存し処理します。

0

エンティティ間には2種類のリンクがあります。

一つを参照である:1つのエンティティが別の参照が含まれている場合。そのエンティティは独立しており、そのいずれかをそのタイプの別の適切なエンティティと組み合わせることができます。例えば

:いくつかのエンティティは、いくつかの理由でいくつかのクラスを超えるいくつかのテーブル/スプリットに格納されている単一のオブジェクトを表す場合:顧客との製品、ユーザーとアドレス等

は別タイプをaggreagting あります。しかし、依然として、単一オブジェクトであることがあります:他の部分がないと意味がなく、他のエンティティと組み合わせることはできません。この場合の1つのエンティティは常にメジャーであり、メジャーを削除すると常に集約エンティティが削除されます。例えば

:注文と注文項目、家およびそれの客室など

の参照は関係、凝集が所有している表します。

参照エンティティを保存するべきではない参照して、エンティティのSO 保存(参照エンティティの場合を除いては、新規であるが、この場合には、参照エンティティの前に保存することが好ましいです)。

集約を持つエンティティを保存すると、集約エンティティを保存する必要があります。単一の取引で。これは単一のオブジェクトであるためです。また、(パフォーマンスが非常に重要な場合にのみ)集約を個別に保存することをお勧めします。そうしないと、並行性に多くの問題が発生します。

関連する問題