Шаблон репозитория: ограничение, цель и преимущества - PullRequest
2 голосов
/ 28 марта 2012

Я новичок в шаблоне репозитория, и у меня возникают следующие вопросы:

  1. Какова / есть цель шаблона репозитория?
  2. Что является / является ограничениемшаблон хранилища?
  3. Каковы / могут быть преимущества шаблона хранилища?
  4. Должны ли методы, представленные ниже, отображаться в шаблоне хранилища?

public IQueryable<T> GetQuery(){
    return _objectSet;
}

public IEnumerable<T> GetAll(){
    return GetQuery().AsEnumerable();
}

public IEnumerable<T> Find(Expression<Func<T, bool>> predicate){
    return _objectSet.Where(predicate);
}

public T Single(Expression<Func<T, bool>> predicate){
    return _objectSet.Single(predicate); 
}

public T First(Expression<Func<T, bool>> predicate){
    return _objectSet.First(predicate);
}

Любая помощь, пожалуйста?

1 Ответ

0 голосов
/ 27 июня 2013

1. Какова / есть цель шаблона репозитория?

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

2.Что является / является ограничением шаблона хранилища?

Он используется только для абстрагирования источника данных.

Мягкое ограничение состоит в том, что людям трудно понять, как проектировать классы репозитория.Обычно люди делают репозитории универсальными, что, в свою очередь, приводит к утечке реализации БД вызывающей стороне, что вынуждает вызывающего абонента обладать определенным знанием БД (или знанием OR / M).Эти реализации имеют серьезные недостатки и не дают никаких преимуществ по сравнению с использованием OR / M напрямую.

3. Каковы / есть преимущества шаблона хранилища?

Менее сложный код.Вызывающая сторона менее сложна, поскольку им нужно только вызвать метод в репозитории для извлечения и сохранения информации в источнике данных.И уровень доступа к данным менее сложен, так как репозитории фокусируются только на получении и хранении информации.

4. Должны ли представленные ниже методы быть представлены в шаблоне хранилища?

Нет.IQueryable<T> утечка конкретной информации БД.Например, вам нужно знать, как дескриптор OR / M переводит LINQ в IN предложения SQL и как OR / M настроен для отложенной / активной загрузки.

Чтобы уменьшить сложность, хранилище должно сообщать, какого родаЗапросы это поддержка.Использование Expression<Func<T, bool>> predicate - это все равно что сказать , брось мне что-нибудь, и я попытаюсь справиться с этим Не будет работать очень хорошо.Снова.Возьмите IN предложение в качестве примера.Оператор LINQ для него различается в зависимости от оператора OR / Ms.

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

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