Общий репозиторий.Нужно предложение - PullRequest
4 голосов
/ 24 февраля 2011

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

Моя проблема: у меня есть общий репозиторий, построенный поверх NHibernate. Его интерфейс очень прост, такой как Get (идентификатор объекта), Save, Delete и т. Д. Иногда этот интерфейс работает нормально, но иногда нет. Например, несколько объектов в моем проекте имеют свойство с именем Code (но не все). Я хочу иметь возможность получить сущность не только по первичному ключу, но и с этим свойством. Другая ситуация, когда мне нужно отфильтровать некоторые объекты с датами или предоставить другие критерии фильтрации, которые являются специфическими для отдельных объектов. В настоящее время я думаю о следующих решениях:

  • Linq - Я могу вернуть объект IQueryable из репозитория для каждого типа, а затем отфильтровать запрос, используя выражения linq. Мне не нравится эта идея, потому что, если я пойду этим путем, я не увижу причину хранилища.
  • Репозиторий, специфичный для объекта - Здесь я могу построить объект, специфичный для общего репозитория. У него будут такие методы, как Get (DateTime dateFrom, DateTime dateTo) и т. Д. Недостатком является то, что мне придется создавать класс репозитория для каждого объекта сущности. Хорошей стороной является то, что будет намного проще сохранить / удалить граф объектов из базы данных, потому что он знает зависимости сущности.
  • Скажите, пожалуйста:)

Ответы [ 5 ]

3 голосов
/ 24 февраля 2011

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

Этот мой ответ (пока 36 голосов) развивает эту позицию и содержит подход, который вы могли бы использовать:

Преимущество создания общего хранилища по сравнению с конкретным хранилищем для каждого объекта?

3 голосов
/ 24 февраля 2011

Учитывая, что у вас уже есть общий интерфейс репозитория (я полагаю), я бы пошел с Entity-специфичным репозиторием , но реализовал бы его, расширив свой универсальный репозиторий. Это должно сделать код более доступным для обнаружения и позволить вам продолжать придерживаться шаблона вашего хранилища. Это позволит вам добавить методы для получения по коду и для получения путем передачи в диапазоне дат.

2 голосов
/ 24 февраля 2011

Я рекомендую использовать агрегированные репозитории, а не репозитории, ориентированные на отдельные объекты.Например, если у вас есть сущности

Project
ProjectStatus
ProjectType

, имеет смысл объединить доступ ко всем этим данным в одном репозитории вместо трех отдельных.

0 голосов
/ 24 февраля 2011

Вы можете использовать именованные запросы для получения строк на основе столбца, который не является ключом, или выполнять какую-либо фильтрацию с использованием языка запросов Hibernate (hql), который очень похож на операторы sql.

Этоможет помочь.

0 голосов
/ 24 февраля 2011

Я использую что-то похожее на это: Обратите внимание, это для Entity Framework, но модель / дизайн можно использовать где угодно, я думаю.

public interface IRepository<T>
{
    T Save(T entity);
    void Delete(T entity);
    IQueryable<T> GetAll();
    T GetById(int id);
}

Я поднял его из ряда вопросов, в которых обсуждается использование IQueryable, но главное преимущество в том, что вы можете легко издеваться над IRepository.

См. этот ответ для получения полной информации.

...