Зачем нужен шаблон репозитория в NHibernate?

13

Я читаю официальное Ваше первое приложение на основе NHibernate .

Хотя учебник хорош и легок для понимания, мне интересно, почему используется шаблон Repository.

В различных Add, Update, Removeметоды в ProductRepositoryреализации, код почти идентичен - все они используют транзакции, а разница в «мясо» , то есть вызов session.SaveINT Addметод, session.Deleteв removeметоде. ( На странице отсутствуют привязки HTML, но вы можете выполнить поиск на соответствующем коде, например public void Remove,public void Add )

Этот код просто "чувствует себя неправильно".

Почему автор использует шаблон Repository - это просто для демонстрации использования NHibernate или это требуется или по какой-то другой причине?

Ps. Мой опыт работы в Ruby on Rails с использованием ActiveRecord, поэтому я пытаюсь понять, как работает / используется NHibernate.

Zabba
источник
1
Если вы предпочитаете паттерн ACtive Record, тогда вы можете использовать активную запись Castle,
Бен Робинсон
3
Это критический вопрос. Существует спор о том, использовать его или нет. Айенде написал свои аргументы, чтобы не использовать его в репозитории нового синглтона

Ответы:

10

Шаблон хранилища не требуется. Что касается всех остальных шаблонов, то это «архитектурное» решение, которое вы должны принять в соответствии с потребностями вашего бизнеса. В общем случае, шаблон репозитория используется для реализации «Entity Persistance Ingorance», что означает, что ваши сущности ничего не знают о том, как сохранить себя на вашем устройстве хранения (База данных, XML, TextFile и т. Д.). Если, например, у вас есть адрес объекта, он не будет содержать логику персистентности (вы нигде не найдете что-то вроде address.Save или address.Update), но вы передадите свой объект в метод репозитория, который отвечает за сохранение изменения

Массимилиано Пелусо
источник
Я думаю, что да и нет. Сам сеанс NHibernate является своего рода общим хранилищем. Таким образом, добавление дополнительного репозитория, как правило, не более, чем добавление фасада к объекту сеанса.
на самом деле мой ответ начинается так: «Шаблон хранилища не требуется ...». Это может быть просто архитектурное решение, в соответствии с бизнес-потребностями, вот и все
Я полностью согласен с этим. Но я упустил момент, что сама сессия является хранилищем, вот и все.
9

Преимущество использования шаблона репозитория заключается в том, что он позволяет имитировать уровень доступа к данным, чтобы вы могли тестировать код бизнес-уровня без вызова кода DAL. Есть и другие большие преимущества, но мне кажется, что это очень важно.


источник
2
+1 шаблон ActiveRecord делает очень трудным изолировать DAL для имитации, обычно заканчивая модульными тестами, требующими собственной базы данных (в этом случае модульный тест становится интеграционным тестом).
MattDavey