Шаблон репозитория Пошаговое объяснение [закрыто]

276

Может кто-нибудь, пожалуйста, объясните мне Шаблон репозитория в .NET, шаг за шагом приводя очень простой пример или демонстрацию.

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

Са Патил
источник
1
Здесь есть хорошая статья
ssmith

Ответы:

199

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

Очень часто вы обнаруживаете, что SQL-запросы разбросаны по базе кода, и когда вы добавляете столбец в таблицу, вам приходится искать файлы кода, чтобы попытаться найти использование таблицы. Влияние изменений имеет далеко идущие последствия.

При использовании шаблона репозитория вам нужно будет изменить только один объект и один репозиторий. Воздействие очень мало.

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

  • У вас есть единственное место для внесения изменений в ваш доступ к данным

  • У вас есть одно место, ответственное за набор столов (обычно)

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

Есть и другие преимущества, например, если вы использовали MySQL и хотели перейти на SQL Server - но я никогда не видел это на практике!

Фентон
источник
28
RE переключаясь с dbms a на b, я пойду на запись, что я не только видел это, я делал это в рабочем коде. Ранее мы использовали Oracle, нам пришлось сменить хостинг-провайдера, остановившись на Azure (до того, как они поддержали Oracle), поэтому нам пришлось перейти на SQL Azure. К сожалению, мы не разделили всю логику доступа к данным на этом этапе, но мы, безусловно, сделали это так же, как и эту миграцию (и я могу добавить, что в будущем).
Джо
5
Я знаю, что этот комментарий старый и закрыт как не по теме, но я видел, что это было сделано в нескольких компаниях. Как правило, это часть процесса перехода к ORM или от него. Хранилище облегчает его переключение, особенно если вы загружаете их из абстрактного фабричного шаблона или используете контейнер IoC.
Дерек Ван Куйк
На самом деле репозиторий использует DAO для операций, связанных с источником данных ...
Юша Алеауб,
1
@YoushaAleayoub, это хорошая мысль, которую вы подняли. Обычно вы найдете объекты доступа к данным, когда люди пытаются «разделить базу данных», а репозитории, когда люди пытаются «сделать одну вещь ответственной за запрос». Почти во всех случаях вы найдете оба вместе. Часть DAO - это часть IConnection, ICommandetc, которая скрывает тип базы данных. Хранилище обычно больше ориентировано на домен.
Фентон
181

Это хороший пример: Пример шаблона репозитория в C #

По сути, хранилище скрывает детали того, как именно данные извлекаются / сохраняются из / в базу данных. Под одеялом:

  • для чтения создает запрос, удовлетворяющий заданным критериям, и возвращает набор результатов.
  • для записи он выдает команды, необходимые для сохранения базового механизма персистентности (например, базы данных SQL) для сохранения данных
twoflower
источник
13
Этот пример является лучшим объяснением, просто лучше, чем документация MSDN.
Теоман Шипахи
2
Я нашел это очень хорошо. Это также дает достойное объяснение Единицы работы, которая, кажется, является более общей формой
Шаблонов
8
Связанный пример - ошибка шаблона репозитория. Это не дает никаких преимуществ по сравнению с использованием интерфейсов, предоставляемых Entity Framework ( IDbContext) или ISessionнапрямую в nhibernate ( ). Правильно реализованный репозиторий абстрагирует ВСЕ данные, специфичные для персистентности (например, как работает текущий поставщик Linq To Sql). т.е. никогда не подвергать IQueryable.
jgauffin
3
@jgauffin IQueryableне является информацией о персистентности. Поддержка IQueryable может быть такой же простой, как жестко заданный массив, или может быть из файла XML, веб-службы, базы данных, плоского файла и т. Д. Я бы не рекомендовал репозиторий, который не предоставляет IQueryable, как всегда приводит к медленному доступу к данным в каждом случае, где предоставление IQueryable позволит некоторым экземплярам повышать производительность, где это применимо, если хранилище постоянных данных имеет такую ​​возможность. Кроме того, скрытие DbContext позволяет вам переключаться на другой ORM, если это необходимо (или без ORM!)
Роберт Макки,
5
Это утечка информации постоянства информации конкретной. Попытайтесь использовать энергичную / ленивую загрузку или создание предложения INsql, не зная, как это делает конкретный поставщик LinqToSql.
JGauffin