残念ながら、Repository パターンの意図を少し誤解しています。
リポジトリは、特定のドメイン オブジェクト (通常は集約ルート) のメモリ内コレクションのように動作することを意図しています。
interface EmployeeRepository
{
List<Employee> retrieveBy(Criteria someCriteria);
void store(Employee someEmployee);
int countOf(Criteria someCriteria);
// convenience methods
Employee retrieveById(String id);
Employee retrieveBySSN(String ssn);
}
このコードのクライアントは、単体テストの場合のように、コレクションがメモリ内にあるかどうか、場合によっては ORM マッパーと通信するか、他の場所でストアド プロシージャを呼び出すか、特定のドメイン オブジェクトのキャッシュを維持するかを認識しません。 .
これはまだあなたの質問に答えていません。実際、適切なリポジトリにデリゲートする save() および load() メソッドをドメイン オブジェクトに含めることができます。永続性がビジネス ドメインの一部になることはほとんどなく、ドメイン オブジェクトを変更する理由が複数あるため、これは正しい方法ではないと思います。
とりとめのないものについては、この関連する質問を確認してください。
この回答に関するいくつかのコメントへの回答:
正当な批判。ただし、既存のドメイン オブジェクトのコンテキスト内で単一のドメイン オブジェクトまたは関連するドメイン オブジェクトのコレクションを取得する方法については、まだ混乱しています。–ガブリエル1836
従業員が多くのスキルを持っているとしましょう。次のように従業員リポジトリがスキル リポジトリを呼び出しても問題はないと思います。
// assume EmployeeRepository talks to a DB via sprocs
public Employee retrieveById(String id)
{
ResultSet employeeResultSet = this.database.callSproc("PROC_GetEmployeeById",
new Object[] { id });
List<Skill> skills =
new SkillRepository().retrieveBy(new EqualsCriteria("EmployeeId", id));
Employee reconstructed = new EmployeeFactory().createNew().
fromResultSet(employeeResultSet).
withSkills(skills).
build();
return reconstructed;
}
もう 1 つの方法は、スキル リポジトリを呼び出す代わりに、従業員リポジトリに、この例ではストアド プロシージャを呼び出してスキルの結果セットをロードさせ、次にスキル ファクトリに委任してスキルのリストを取得させることです。
リポジトリを呼び出すことはできませんか? データ マッパーへの呼び出しを発行するか、オブジェクトをメモリ内にロードするかは問題ですよね? –ガブリエル1836
その通りです。私は通常、単体テストでデータ層全体をこの方法でモックアウトします。