恐怕你稍微误解了存储库模式的意图。
存储库的行为类似于特定域对象的内存集合,通常是聚合根:
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() 方法。我认为这不是正确的方法,因为持久性几乎从来都不是业务领域的一部分,它为您的领域对象提供了不止一个改变的理由。
查看this related question 了解更多信息。
回应一些关于这个答案的cmets:
有效的批评。不过,我还是
然后对如何获得单身感到困惑
域对象或集合
相关领域对象在
现有域对象的上下文。
– 加布里埃尔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;
}
另一种方法是不调用技能存储库,而是让员工存储库调用(在此示例中)存储过程以加载技能的结果集,然后委托给技能工厂以获取技能列表。
我不能调用存储库吗
以及它是否向
数据映射器或加载对象
内存是它的关注点,不是吗? –
加布里埃尔1836
完全正确。我通常以这种方式在单元测试中模拟整个数据层。