Реализация паттерна «Репозиторий» (Repository) в C#

«Репозиторий» — один из наиболее часто используемых паттернов проектирования при работе с базами данных (БД). Он позволяет отделить программную логику, работающую непосредственно с БД, от всей остальной программы выступая посредником меду ними с помощью интерфейса во многом схожего с коллекциями.

В чем преимущество использования паттерна «Репозиторий»?

  • Отделение программной логики работающей непосредственно с БД от всей остальной программы. Если требуется изменить логику работы с БД или даже тип БД (например, перенос БД с MS SQL Server на MySQL), то внесение изменений осуществляется локально и централизованно. Нет необходимости вносить многочисленные правки по всей программе с вероятностью что-либо пропустить и тем самым спровоцировать ошибку в работе программы.
  • С помощью «Репозитория» можно значительно упростить и алгоритмы по работе с БД в остальной программе. Чаще всего для выполнения какой-либо операции с БД достаточно вызвать один из методов класса реализующего этот паттерн.

В «джентельменский набор» при реализации «Репозитория» обычно включается следующий функционал:

  • Создание (Create). Добавление записи в БД;
  • Чтение (Read). Выборка имеющихся записей из БД;
  • Обновление (Update). Редактирование имеющихся записей;
  • Удаление (Delete) имеющихся записей.

Иначе говоря, CRUD.

В силу своих особенностей паттерн «Репозиторий» удобнее всего реализовать на основе какой-либо ORM библиотеки. Например, входящих в состав .NET Framework, LINQ to SQL и Entity Framework.

Рассмотрим пример реализации паттерна «Репозиторий» на основе LINQ to SQL.

Вначале определим закрытое поле для контекста БД и инициализируем его в конструкторе класса.

С помощью этого поля и будут производиться все операции над БД. Для того чтобы их реализовать воспользуемся средствами LINQ to SQL, как показано ниже.

Выборка коллекции записи:

 public IEnumerable<Test> GetTests()

Как вариант, просто:

 Выборка одной записи (в данном случае по id):

 Добавление записи:

 Редактирование записи:

 Удаление записи (в данном случае тоже по id):
 public void DeleteTest(int testId)

Теперь все CRUD операции для работы с таблицей Test можно выполнять с помощью созданного нами «Репозитория». Например, выборка данных будет выглядеть следующим образом:

 А, удаление записи:

 Подобный подход гораздо удобнее написания кода по работе с контекстом БД «на месте» и обладает значительно большей гибкостью. Реализация методов класса-«репозитория» может быть изменена независимо от остального кода. Кроме того, как уже говорилось выше, существенно сокращается объём кодирования при обработке данных и создании графического интерфейса, так как, помимо CRUD операций, при необходимости, можно реализовать и другие.

Если необходимо сделать так, чтобы можно было работать с разными системами управления БД (СУБД), то эта задача также легко решается с помощью паттерна «Репозиторий».

Для этого необходимо разработать общий для всех используемых СУБД интерфейс и реализовать его в виде классов-«репозиториев» для каждой СУБД.

Пример такого интерфейса для рассматриваемой в этой статье таблицы Test приведён ниже:

 Таким образом, паттерн «Репозиторий» предлагает удобное и рациональное решение многих вопросов связанных с разработкой приложений использующих БД.
Список источников
  1. Repository. Martin Fowler.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *