Репозиторий и шаблон Спецификации

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

Это - то, что я рассматриваю:

  • Я хотел бы универсальный репозиторий

  • Я не хочу возвращать IQueryable из своего репозитория.

  • Я хотел бы инкапсулировать свои запросы в спецификациях.

  • Я реализовал шаблон спецификации

  • Это должно быть легко тестируемым

Теперь это - то, где я вовлекаю немного, и мой вопрос - каким путем был бы самый изящный способ назвать метод находки с одной или несколькими спецификациями:

(Быстрый): bannerRepository.Find().IsAvailableForFrontend().IsSmallMediaBanner()

или экспресс запрашивает как лямбды с моими спецификациями

(Лямбда): bannerRepository.Find.Where(banner => banner.IsFrontendCampaignBanner && banner.IsSmallMediaBanner)

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

То, чего я надеюсь достигнуть, должно сохранить som гибкость относительно способности объединить спецификации и дать опыт "фильтрации" с specfications, но не пропуская IQueryable к контроллеру, но больше как ISpecifiable, это только позволяет изменять запрос со спецификациями а не с Linq. Но я просто вернулись в протекающей логике запроса к контроллеру этот путь?

6
задан Luhmann 8 February 2010 в 12:42
поделиться

2 ответа

Если вы просто хотите сообщить об ошибке:

#ifdef RELEASE
  #error Release mode not allowed
#endif

будет работать с большинством компиляторов.

-121--1085740-

Для этого можно использовать директиву error . Следующий код вызовет ошибку во время компиляции, если DEBUG не определен:

#ifndef DEBUG
#error This is an error message
#endif
-121--1085739-

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

bannerRepository.Find.IsAvailableForFrontend.IsSmallMediaBanner.Exec()

Являясь Exec () методом выполнения спецификаций для репо.

но даже если вы не используете свойства, я бы подошел к свободно используемому API, так как он имеет минимальный шум.

2
ответ дан 17 December 2019 в 04:46
поделиться

Лично я бы выбрал лямбда-метод. Возможно, это из-за моей любви к лямбда-выражениям, но она предоставляет много места для настройки общего репозитория.

Принимая во внимание следующее:

bannerRepository.Find.Where(banner => banner.IsFrontendCampaignBanner && banner.IsSmallMediaBanner)

Я не знаю, как выглядит ваш шаблон, но вы могли бы рефакторинг некоторых вещей здесь:

Создайте универсальный интерфейс типа «IRepository», содержащий все методы доступа к данным.

Это может выглядеть так:

interface IRepository<T> where T : class
{
    IEnumerable<T> FindAll(Func<T, bool> exp);

    T FindSingle(Func<T, bool> exp);
}   

Создайте абстрактный класс «Репозиторий», реализующий этот интерфейс:

class Repository<T> : IRepository<T> where T : class
{
    TestDataContext _dataContext = TestDataContext();

    public IEnumerable<T> FindAll(Func<T, bool> exp)
    {
        _dataContext.GetTable<T>().Where<T>(exp);
    }

    public T FindSingle(Func<T, bool> exp)
    {
        _dataContext.GetTable<T>().Single(exp);
    }
}

Теперь мы можем создать интерфейс для таблицы / объектов баннеров, который реализует наш «IRepository» и конкретный класс, расширяющий абстрактный класс Repository и реализация IBannerInterface:

interface IBannerRepository : IRepository<Banner>
{
}

И соответствующий репозиторий для его реализации:

class BannerRepository : Repository<Banner>, IBannerRepository
{
}

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

Таким образом, вызвать эти методы будет очень просто:

BannerRepository _repo = new BannerRepository();

_repo.FindSingle(banner => banner.IsFrontendCampaignBanner && banner.IsSmallMediaBanner);

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

Надеюсь, это поможет!

1
ответ дан 17 December 2019 в 04:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: