Паттерн «Репозиторий» в качестве модели в ASP.NET MVC

Как известно, в MVC модель содержит в себе бизнес-логику приложения и, при необходимости, обеспечивает доступ к данным хранящимся в БД. При этом если учитывать, что подавляющее большинство веб приложений ASP.NET MVC строятся на основе различных СУБД, взаимодействие модели с БД становится насущной потребностью.

Ранее уже рассматривалась архитектура паттерна «Репозиторий», его реализация на C#, а также те преимущества, которые он предоставляет.

Вероятно, с первого взгляда смысл его использования покажется не совсем понятным. Ведь есть LINQ to SQL, Entity Framework и прочие ORM библиотеки, которые по сути уже реализуют весь необходимый функционал. Почему не работать в контроллерах напрямую с ними? Зачем лишние усложнения?

На самом же деле применение данного паттерна является вовсе не лишним и имеет объективные причины.

  • Технология ORM не подразумевает реализацию бизнес-логики. Она всего лишь позволяет более качественно организовать взаимодействие с БД путём отображения её структуры на классы и объекты языка программирования.
    В тоже время класс реализующий паттерн «Репозиторий» можно легко расширить, добавив в него необходимые функции;
  • Объектная модель, созданная с помощью ORM жёстко «привязана» к конкретной БД и её структуре. Паттерн «Репозиторий» позволяет изолировать работу непосредственно с БД от остальной части приложения. Это позволяет реализовать поддержку нескольких БД и даже СУБД, практически не изменяя логику работы клиентской части.

Реализация паттерна «Репозиторий» применительно к моделям в ASP.NET MVC в принципе особой сложности не представляет, хотя в ней и присутствуют некоторые особенности.

Реализация непосредственно паттерна «Репозиторий»

Так как все классы «репозитории» будут связаны с одной и той же БД, целесообразно выделить общий для всех них функционал в абстрактный базовый класс.

Все остальные классы будут добавлять только логику специфическую для каждого конкретного случая. Все свои основные возможности они будут получать от базового класса путём наследования (паттерн «Супертип слоя«).

Интеграция паттерна «Репозиторий» в проект ASP.NET MVC

Как показано выше, реализация паттерна «Репозиторий» в ASP.NET MVC действительно не представляет особого труда. В тоже время для работоспособности приложения этого недостаточно.

Необходимы инициализация подключения к БД и создание экземпляров классов «репозиториев».

Эту задачу лучше всего решить при помощи служебного класса, реализующего паттерн «ленивая загрузка».

С помощью экземпляра этого класса и будет осуществляться доступ к модели в контроллере.

 Однако этот экземпляр также требуется создать. Для этого служит специальная фабрика.

 В свою очередь, данная фабрика должна быть зарегистрирована в Global.asax.

 Только после правильного выполнения всех вышеописанных операций паттерн «Репозиторий» будет интегрирован в проект и приложение сможет выполнять свои функции.

Можно справедливо отметить, что процесс интеграции гораздо сложнее, чем сама его реализация. Но, к сожалению, эти издержки обусловлены самой архитектурой ASP.NET MVC.

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

Источники
  1. Реализация паттерна «Репозиторий» (Repository) в C#. Стрелец Coder
  2. Lazy Load. Martin Fowler

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

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