Боюсь, вы немного неправильно поняли цель шаблона 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 (), которые делегируют в правильный репозиторий. Я не думаю, что это правильный путь, потому что постоянство почти никогда не является частью бизнес-сферы, и это дает вашему объекту домена более чем одну причину для изменения.
Проверьте этот связанный вопрос , чтобы узнать больше.
В ответ на некоторые комментарии к этому ответу:
Действительная критика. Тем не менее, я все еще
растерялся тогда о том, как получить один
доменный объект или коллекция
связанные доменные объекты, когда в пределах
контекст существующего доменного объекта.
- gabriel1836
Допустим, у Сотрудника много навыков. Я не вижу ничего плохого в том, что репозиторий сотрудников вызывает репозиторий навыков, как это:
// 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;
}
Другой путь - вместо вызова хранилища навыков, пусть хранилище сотрудников вызывает в этом примере хранимую процедуру для загрузки результирующего набора навыков, а затем делегирует фабрику навыков, чтобы получить список навыков.
Не могу я позвонить в репозиторий
и выдает ли он вызов
Data Mapper или загружает объект
в памяти это его забота, не так ли? -
gabriel1836
Совершенно верно. Я обычно таким образом копирую весь уровень данных в своих модульных тестах.