Для данного типа объекта хранилище представляет собой набор экземпляров данного типа объекта.
Хранилище не создает экземпляры сущности. Это просто набор (в смысле «набора») экземпляров, которые вы создали ранее. Затем вы добавляете эти экземпляры в хранилище (набор экземпляров). И вы можете получить эти экземпляры.
Набор не дублирует элементы. При наличии идентификатора (например, id = 1) у набора будет только один экземпляр с id = 1, и этот экземпляр будет тот, который вы получите, когда вызываете "theRepo.GetById (1)".
Итак:
Entity a = theRepo.GetById (1);
Entity b = theRepo.GetById (1);
Должно ли хранилище всегда возвращать одну и ту же ссылку в памяти?
См. ОБНОВЛЕНИЕ 3.
Должен ли репозиторий возвращать новый экземпляр сущности, но с
равное состояние?
Нет. Репозиторий должен возвращать экземпляр, который вы добавили ранее. Хранилище не должно создавать новые экземпляры.
В любом случае, чтобы проверить, являются ли два экземпляра одинаковыми, вам не нужно сравнивать ссылки, вы должны сравнить их идентификаторы.
Вы смешиваете понятия. Репозиторий - это просто набор (набор) экземпляров. Экземпляры создаются фабриками (или методами конструктора сущности).
См. Книгу IDDD Вона Вернона (раздел «Коллекционно-ориентированные репозитории» в главе 12).
Надеюсь, это поможет.
UPDATE:
Когда я говорю «... Репозиторий - это набор экземпляров ...», я имею в виду, что он имитирует набор. Моя вина не выражает это хорошо. Что касается обновления экземпляра хранилища, такой операции не существует, поскольку, когда вы извлекаете экземпляр и изменяете его, изменения вносятся в экземпляр хранилища, вам не нужно повторно сохранять экземпляр. Механизм постоянства, реализующий репозиторий, должен иметь возможности для обеспечения такого поведения. См. Главу 12 книги «Реализация DDD» Вогна Вернона.
ОБНОВЛЕНИЕ 2:
Я хочу пояснить, что то, что я говорю здесь, - это мое понимание после прочтения книги IDDD Вона Вернона, а также другой книги («Проектирование доменов в PHP» Карлоса Буэносвиноса). Я вообще не пытаюсь вводить в заблуждение.
ОБНОВЛЕНИЕ 3:
Я задал Вону Вернону следующий вопрос:
По поводу репозитория, ориентированного на коллекцию, у меня есть вопрос:
Если я сделаю Foo aFoo=fooRepository.getById(1); Foo anotherFoo=fooRepository.getById(1);
тогда гарантируется, что обе ссылки одинаковы (aFoo == anotherFoo)?
И он ответил следующее:
Это зависит от механизма обеспечения сохранности, такого как Hibernate / JPA. Похоже, это следует делать, если вы используете один и тот же сеанс в обоих операциях чтения, и оба чтения имеют одинаковую область транзакций, но проверьте это с помощью ORM.