Удаление зависимости базы данных от 3-х уровневой архитектуры
Я работал как часть команды над некоторыми трехуровневыми приложениями в течение значительного времени. Мне нравится эта архитектура, но во всех этих приложениях я заметил сильную зависимость двух верхних уровней от уровня абстракции данных. Это затрудняет тестирование и макетирование, поскольку практически невозможно запустить приложение или выполнить некоторые методы без существующего подключения базы данных к достаточно большой базе данных. Есть шаблон, который пытается решить эту проблему?
1 ответ
Принцип обращения зависимостей (DIP, один из принципов SOLID) в точности соответствует ситуации, которую вы описываете:
A. Модули высокого уровня не должны зависеть от модулей низкого уровня. Оба должны зависеть от абстракций.
Б. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
Для вашей ситуации, в частности, важна часть A: вместо того, чтобы пользовательский интерфейс и бизнес-логика ссылались на уровень данных, эти уровни должны зависеть только от абстракций (например, интерфейсов), которые могут быть реализованы различными способами. Для бизнес-уровня это означает, что вы определяете интерфейсы, от которых зависит бизнес-уровень. Уровень данных обеспечивает реализацию этих интерфейсов.
Для тестов вы можете предоставить другую реализацию соответствующих частей интерфейсов. Таким образом, вы можете предоставить именно те данные, которые используются в тесте, вместо того, чтобы иметь полную базу данных, готовую к тестированию.
Этот паттерн также называется инверсией контроля. Вы скоро обнаружите, что у вас будет несколько интерфейсов, которые вам понадобятся для реализации ваших программ. Вы можете решить эту проблему, используя абстрактные фабрики или - проще - Inversion of Control Container, который настроен с регистрациями для конкретных типов, которые реализуют интерфейсы.
Другим шаблоном, который может оказаться полезным в этом отношении, является шаблон репозитория.