Я пишу ORM и не уверен в ожидаемом поведении Репозитория, или, точнее, границы между Репозиторием и Единицей Работы.Насколько я понимаю, хранилище может выглядеть так:
interface IPersonRepository
{
public function find(Criteria criteria);
public function add(Person person);
public function delete(Person person);
}
Согласно Фаулеру ( PoEAA , стр. 322):
Репозиторий является посредником междууровни отображения доменов и данных, действующие как набор объектов домена в памяти.[...] Объекты могут добавляться и удаляться из репозитория, как и из простой коллекции объектов.
Это будет означать, что следующий тест должен работать (при условии, что у нас уже естьПерсона сохранилась, чья фамилия Фаулер):
collection = repository.find(lastnameEqualsFowlerCriteria);
person = collection[0];
assertEquals(person.lastname, "Fowler");
person.lastname = "Evans";
newCollection = repository.find(lastnameEqualsFowlerCriteria);
assertFalse(newCollection.contains(person));
Это означает, что при отображении в базу данных, даже если где-либо не был вызван явный метод save (), модель Person должна сохраняться автоматическирепозиторием, так что следующий запрос вернул правильную коллекцию, , а не , содержащую исходную персону.
Но разве это не роль Единицы работы, чтобы решить, какая модельдля сохранения в базе данных, и когда?
В описанной выше реализации репозиторий должен решить сохранить Персона, ранее извлеченную при получении другого вызова find (), чтобы результат соответствовал модификации.Но если бы не был выполнен какой-либо другой вызов find (), модель вообще не сохранялась бы неявно.
В контексте единицы работы это на самом деле не проблема, потому что мы можем начать транзакциюв начале и откатить любую вставку в БД в любом случае, если это необходимо.Но может ли этот репозиторий, если он используется один, привести к неожиданному, непредсказуемому поведению?