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


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) для сохранения данных

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.