Что вы понимаете по шаблону репозитория?
-
05-07-2019 - |
Вопрос
Я нахожусь в процессе ознакомления с технической документацией для проекта, который я завершил несколько месяцев назад, и один из них близок к завершению. Я использовал репозитории для абстрагирования слоя доступа к данным в обоих случаях и писал краткую сводку паттерна в нашей вики на работе. Р>
Во время написания этого резюме я понял, что во второй раз я использовал немного другой подход.
Один из них использовал явный метод InsertOnSubmit
в сочетании с единицей работы и неявным обновлением с отслеживанием изменений UoW. Другой имел метод Save
, который вставлял новые записи и обновлял существующие (без UoW).
Какой подход вы обычно предпочитаете? Рассмотрим обычные сценарии CRUD, где должна лежать ответственность для каждого из них?
Решение
Я думаю, что для реализации следует оставить в хранилище единицу работы, кэширование или любые другие связанные концепции. Я предпочитаю, чтобы интерфейс напоминал хранилище данных, которое соответствует модели предметной области под рукой. Чтобы хранилище клиентов выглядело примерно так:
interface ICustomerRepository
{
Customer Load(int id);
IEnumerable<Customer> Search(CustomerQuery q);
void Save(Customer c);
void Delete(Customer c);
}
Это может быть легко реализовано с помощью NHibernate, NHibernate с NHibernate.Linq, прямой библиотеки SQL или даже хранилища XML или плоских файлов. Если возможно, мне нравится хранить концепцию транзакции вне репозитория или в более глобальном масштабе, чтобы операции нескольких репозиториев могли быть частью одной транзакции.