Реализовать поддельное хранилище NHibernate - PullRequest
2 голосов
/ 28 мая 2011

Я использую StoryQ для проведения базового тестирования интеграции, и мы используем NHibernate в качестве нашего ORM.Когда я начинал, я не знал, что NHibernate реализовал шаблон Repository, и поэтому я создал свой собственный IRepository для запуска моих интеграционных тестов.

Однако, учитывая, что NHibernate уже реализует шаблон Repository, я предполагаю, что он делает это с неким интерфейсом.Итак, я хотел бы работать против интерфейса NHibernate для репозитория, если мои предположения верны.

Я пытался найти его, но натолкнулся на информацию, что для этого мне нужно работать с интерфейсом ISession.Поскольку я не очень хорошо знаю NHibernate, может кто-нибудь объяснить, почему мне нужно было бы реализовать свой поддельный репозиторий с интерфейсом ISession?Что такое эквивалент IRepository в NHibernate?Есть ли какой-нибудь учебник, который углубляется в это дело?

Ответы [ 3 ]

3 голосов
/ 28 мая 2011

NHibernate не реализует шаблон репозитория. Это заменяет это.

Базы данных SQLite в памяти хороши, если у вас есть простая реализация базы данных, но я обнаружил, что вещи могут стать громоздкими быстро, почти до такой степени, что становится настолько болезненным, если не больше, использовать SQLite как это заглушка / макет ISession / ICriteria / etc.

Один прекрасный пример этого: в одном из моих недавних проектов, в которых я использовал PostgreSQL в качестве производственной базы данных и SQLite в качестве тестовой базы данных, мне нужно было расширить NHibernate, чтобы добавить поддержку агрегатной функции, которая была недавно добавлен в PostgreSQL. Выяснение, как добавить это, было историей само по себе, но я решил это. Затем мне пришлось найти функциональный эквивалент в SQLite. Мне нужна была агрегатная функция, которая работала точно так же, как и ее коллега из Postgres. Там не было ни одного. Я спросил, и мне сказали, что есть способы расширить NHibernate, чтобы «подделать» эту функцию в SQLite. У меня также была возможность расширения SQLite для добавления этой функциональности.

Все, что я хотел сделать, это написать два, может быть, три теста вокруг сценария, который я пытался реализовать. Я потратил слишком много времени, пытаясь обеспечить функциональную эквивалентность между двумя системами. Это не стоило всех этих усилий для одной функции. А что будет, если в будущем мне понадобится добавить еще одну функцию?

Я думаю, что SQLite полезен. Это отличная облегченная система баз данных, и мне нравится, что вы можете удобно использовать ее как базу данных в памяти для простых сценариев. Тем не менее, я не уверен, что стоит использовать дальше. Я думаю, что теперь я буду использовать одну и ту же базу данных во всех средах, даже если это будет означать более медленные интеграционные тесты для всей логики сохранения данных.

1 голос
/ 29 мая 2011

Подход, который я выбрал, состоит в том, чтобы реализовать IRepository и GenericRepository, чтобы обернуть методы ISession Save и Delete.Кроме того, GenericRepository также реализует IQueryable с использованием поставщика LINQ NHibernate.Моя реализация в значительной степени заимствована из проекта Хавьера Лозано MVC TrubineЕго реализация здесь: https://github.com/jglozano/mvcturbine/blob/master/src/Blades/NHibernate/MvcTurbine.NHibernate/GenericRepository.cs

Это работает примерно для 80% запросов, которые мне нужны.В остальном я создаю объект запроса, чтобы обернуть запрос.Таким образом, я могу использовать ICriteria, IQuery, IQueryOver или LINQ, в зависимости от потребностей запроса.Фабио Мауло объясняет это довольно хорошо: http://fabiomaulo.blogspot.com/2010/07/enhanced-query-object.html

Оба подхода позволяют легко высмеивать зависимость.

1 голос
/ 28 мая 2011

Я не уверен, где в ядре NHibernate есть интерфейс IRepository (у AFAIK его нет), поэтому вы можете ссылаться на некоторые другие побочные проекты NHibernate.

Это не лучший подход к насмешкам над ISession. На мой взгляд, лучше всего использовать реальную базу данных в памяти, которая полностью поддерживается NHibernate. Возможно, вам придется проверить, как настроить NHibernate для работы с базой данных sqlite в памяти, которая в основном просто настраивает NHibernate в ваших тестах.

Хорошая особенность этого подхода заключается в том, что тесты выполняются с очень хорошей скоростью, как будто в них нет базы данных, и вам не нужно абстрагироваться от всей функциональности ORM (и лишних функций тоже) только для запуска / Проведи свои тесты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...