Вопрос

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

Во время написания этого резюме я понял, что во второй раз я использовал немного другой подход.

Один из них использовал явный метод 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 или плоских файлов. Если возможно, мне нравится хранить концепцию транзакции вне репозитория или в более глобальном масштабе, чтобы операции нескольких репозиториев могли быть частью одной транзакции.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top