В статье «Пример описания многослойной архитектуры, основанной на использовании наборов подслоёв и иерархии моделей данных» рассмотрен подход к построению многослойной архитектуры приложения с использованием трёх слоёв и девяти подслоёв.

Использование такого набора взаимодействующих между собой слоёв и подслоёв даёт возможность максимально детально описать структуру функционала приложения. Продолжая далее этот подход можно детализировать каким именно функционалом наполняются подслои приложения и для наполнения подслоёв использовать архитектурные блоки. Под архитектурным блоком далее будет пониматься типовой функционал определённого подслоя приложения.

Анализируя типовой функционал приложения можно выделить 9 основных архитектурных блоков.

Архитектурный блок

Слой / подслой, в котором находится архитектурный блок

Application façade

Facade layer façade sublayer

Application façade logic

Facade layer logic sublayer

Application logic

Logic layer façade sublayer

Domain logic

Logic layer logic sublayer

Логика обработки внешних данных

Facade layer data access sublayer или logic layer data access sublayer

Persistence façade

Persistence layer façade sublayer

Persistence logic

Persistence layer logic sublayer

Persistence connector

Persistence layer data access sublayer

Клиентские части для взаимодействия с веб-сервисами и внешними источниками частично структурированных (semi-structured) данных

Infrastructure layer

Таблица 1. Перечень архитектурных блоков и их связь со слоями и подслоями приложения.

Рисунок 1. Архитектура приложения с указанием связей архитектурных блоков со слоями и подслоями.
Рисунок 1. Архитектура приложения с указанием связей архитектурных блоков со слоями и подслоями.

В книгах

  1. Фаулер Мартин. Архитектура корпоративных программных приложений. - "Вильямc", 2006.

  2. Marinescu Floyd. EJB design patterns: advanced patterns, processes, and idioms. - New York: John Wiley, 2002.

  3. Nilsson Jimmy. .NET Enterprise Design with Visual Basic .NET and SQL Server 2000. - Sams, 2002.

    описаны примеры архитектуры, использующие 5 слоёв.

Фаулер

Marinescu

Nilssen

Presentation layer

Presentation layer

Consumer layer

Application controller

Application layer

Consumer helper layer

Application logic

Services layer

Application layer

Domain model

Domain layer

Domain layer

Data source

Persistence layer

Persistence access layer

Таблица 2. Соответствие между списками слоёв приложения из книг Фаулера, Marinescu, Nilssen.

Такой набор слоёв достаточно точно соответствует приведенному в таблице 1 набору архитектурных блоков. В таблице 3 показано соответствие между списком слоёв приложения из этих книг и списком архитектурных блоков.

Архитектурные блоки

Фаулер

Marinescu

Nilssen

Application façade

Presentation layer

Presentation layer

Consumer layer

Application façade logic

Application controller

Application layer

Consumer helper layer

Application logic

Application logic

Services layer

Application layer

Domain logic

Domain model

Domain layer

Domain layer

Логика обработки внешних данных

Persistence façade

Data source

Persistence layer

Persistence access layer

Persistence logic

Persistence connector

Таблица 3. Соответствие между списком слоёв приложения из книг Фаулера, Marinescu, Nilssen и списком архитектурных блоков.

Рассмотрим более детально функционал, который реализуют архитектурные блоки.

Фасад приложения (application facade) это набор визуальных форм и обработчиков событий визуальных форм или набор endpoint веб-сервиса и обработчиков запросов/сообщений, полученных от внешних потребителей.

Логика фасада приложения (application facade logic) в первую очередь отвечает за внутренние алгоритмы обработки данных всего слоя и вызов функционала use case из logic layer. Также среди типовой логики подслоя аутентификация и авторизация пользователя, валидация входных данных, полученных от консюмера приложения. В технологии asp.net mvc в этом подслое формируется контент веб-формы с использованием шаблона веб-формы приложения и данных из view model, который веб-сервер отправляет в виде ответа на запрос по url-адресу.

Логика приложения (application logic, точка входа в функционал use case) реализует логику приложения, которая координирует выполнения операций бизнес-логики, внутренней логики приложения и обработки внешних данных.

Логика домена приложения (domain logic) функционал предметной области приложения.

Логика обработки внешних данных используется как при прямом взаимодействии с внешними источниками данных для работы с веб-сервисами и хранилищами частично структурированных (semi-structured) данных, так и при взаимодействии с внешними данными посредством слоя приложения persistence layer (при работе с реляционными базами данных).

Слой persistence layer используется при работе с хранилищами структурированных данных таких как реляционные базы данных.

Persistence façade реализует фасад для доступа к внешним персистентным данным в виде набора dao объектов. Использование такого фасада скрывает от вышележащих слоёв детали реализации доступа к внешним данным.

Persistence logic реализует механизмы извлечения и обработки внешних персистентных данных. Для этого можно использовать разнообразные ORM фреймворки или наборы объектов типа persistence manager.

Persistence connector реализует механизмы для работы с соединениями с реляционными базами данных и для работы с пулами таких соединений. Persistence connector непосредственно взаимодействует с механизмами Data Access API, которые для доступа к данным используют интерфейсы JDBC, ODBC, OLE DB.

Рассмотрим примеры клиентских частей приложения для взаимодействия приложения с веб-сервисами и внешними источниками частично структурированных (semi-structured) данных.

Клиентская часть для взаимодействия приложения с soap веб-сервисом представляет собой прокси объект, который конвертирует полученные в формате soap/xml данные в объекты-сущности своей модели данных data transfer model.

Клиентская часть для взаимодействия приложения с NoSql базой данных MongoDB в качестве прокси объекта использует объект типа MongoClient. Применяя MongoClient и связанные с ним объекты типов MongoServer, MongoDatabase и MongoCollection приложение работает с данными из базы данных MongoDB в своей модели данных persistence model.

В качестве примера, который показывает преимущества детализации архитектуры до уровня слой-подслой, рассмотрим реализацию use case “Создание нового документа”. В примере за счёт использования уровня слой-подслой, показано как можно наиболее оптимально реализовать функционал предусловия use case и функционал use case.
Рассматривается приложение, имеющее визуальный интерфейс пользователя. Use case реализует создание новой сущности типа Document. Сущности этого типа хранятся в базе данных в таблице tblDocuments. Название документа хранится в колонке Title этой таблицы и в поле Title класса Document. Бизнес-логика требует уникальности названия каждого документа в рамках колонки Title в таблице tblDocuments (это является предусловием для выполнения use case). Для обеспечения уникальности названия документа к полю, в котором на форме вводится название документа, привязывается объект-валидатор, который инициирует запрос к базе данных для проверки уникальности введённого на форме названия документа по текущему содержимому колонки Title для всех записей в таблице tblDocuments. В случае не уникальности названия валидатор блокирует механизм создания нового документа и выдаёт на форме сообщение об ошибке. Логика валидации реализует функционал, который архитектурно полностью отвязан от функционала use case создания нового документа. Функционал валидации проходит более простую цепочку вызовов (рисунок 2) через слои и подслои приложения в сравнении с цепочкой вызовов (рисунок 3) при отработке функционала use case.

Рисунок 2
Рисунок 2
Рисунок 3
Рисунок 3