Порты и адаптеры DDD с архитектурой Onion. - PullRequest
0 голосов
/ 14 сентября 2018

пытается выяснить некоторые концепции и не может понять

Что такое сценарий использования в архитектуре портов и адаптеров?

Как должна выглядеть реализация варианта использования?

Что касается варианта использования?

Где он вписывается в инфраструктуру или домен, в нем говорится, что он входит в приложение, ну, кроме того, имеется ядро ​​приложения и служба приложений, которые измое понимание отличается?

На левой стороне адаптер зависит от порта и получает конкретную реализацию порта, которая содержит вариант использования.С этой стороны, порт и его конкретная реализация (вариант использования) принадлежат приложению;

https://herbertograca.com/2017/09/14/ports-adapters-architecture/#what-is-a-port

Эта цитата смущает меня ... потому что от того, что яПод первичным адаптером понимать может быть все, что требует ваша бизнес-логика (его интересует то, что вы предоставляете), WebAPI, MVC, Testing, ConsoleApp.

На левой стороне адаптер зависит от порта и получает конкретную реализацию порта, которая содержит вариант использования.

Итак, я предполагаю, что это относится к вашей бизнес-логике, внедряемой в let; скажем, конструкторе WebApiController

На этой стороне как порт, так и его конкретная реализация (сценарий использования) принадлежат приложению;

И что?кто это

приложение

Это WebApi?или это домен?также, как я понимаю, вариант использования - это реализация моей бизнес-логики, так что, например, дизайн будет выглядеть примерно так?

Client :
WebApiController(IMyBusinessServicePort service)

Infrastructure :
ImplementingPrimaryAdapter : IMyBusinessServicePort { }
ImplementingSecondaryAdapter : ILoggingPort { }

Domain :
ImplementMyBusinessLogicService : IMyBusinessLogicService 

Так что WebApiController будет использовать реализацию, предоставляемую ImplementingPrimaryAdapter, а не что-то измой домен?Я не понимаю

, пожалуйста, объясните.

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Существуют некоторые различия в реализации, в зависимости от того, используете ли вы программирование на основе стека вызовов или, например, модель актора.

Далее я расскажу о случае, наиболее близком к DDD и части "C" в CQRS: внесение изменений в состояние системы. Часть «Q» проще со стороны Hexagon: ее сложность в основном на стороне адаптера.

Что касается меня, я поместил словарь в ядро ​​шестиугольника. Он сопоставляется с моделью DDD Ubiquitous Language и состоит из неизменных структур данных с проверкой бизнес-инвариантов этих структур данных.

Далее, есть точка принятия решения. Когда вы принимаете решение, в соответствии с принципом единой ответственности, вы должны делать только это. Не делать внешние вызовы, ввод-вывод и т. Д. Итак, вам нужна некоторая информация, чтобы принять решение. Когда эта информация собрана, она может быть помещена в объект Command. Вы передаете его лицу, принимающему решение, которое приблизительно сопоставляется с агрегатом DDD. Затем он либо утверждает команду и создает событие или набор изменений (независимо от того, делаете ли вы EventSourcing или нет), либо отклоняется. Без каких-либо внешних звонков. То есть он не использует порты Hexagon.

Внутри шестиугольника остается логика для сбора внешних данных, вызова лица, принимающего решения, и обработки результата. Эта логика может быть смоделирована как простой конечный автомат и проверено модулем. Это то, что я называю прецедентом в моем шестиугольнике. Потому что именно здесь координируются потоки данных между портами и лицами, принимающими решения. Итак, в прецеденте используются порты.

Экземпляр варианта использования создается при получении бизнес-запроса на основной порт Hexagon. Есть FSM и исполнитель UseCase, который фактически вызывает вторичные порты, получает их ответы и продвигает сценарий использования FSM.

Поток обработки сценария использования может состоять из следующих шагов:

  • Подтвердить полученный бизнес-запрос
  • Если неверно - отформатировать бизнес-ответ с ошибкой
  • Если действует - подготовить запросы к вторичным портам
  • Отправить подготовленные запросы
  • Получение ответов вторичных портов
  • В случае сбоя или тайм-аута - отформатировать бизнес-ответ с ошибкой
  • Если данные собраны успешно, подготовьте Команду для лица, принимающего решение
  • Позвоните лицу, принимающему решение, и верните Событие / Изменения / Отказ
  • В случае отклонения - отформатировать бизнес-запрос с ошибкой
  • Если принято - подготовить другой набор запросов для вторичных портов для выполнения решения: сохранить в БД, отправить в MQ, запустить ракеты и т. Д.
  • Ожидание выполнения запросов по вторичным портам
  • Если не удалось - отформатируйте бизнес-ответ с ошибкой
  • Если все в порядке - форматировать бизнес-ответ с успехом

Итак, вариант использования определенно принадлежит домену, так как он зависит не от реализаций адаптеров, а от их интерфейсов. И это формирует прикладной уровень Домена.

Полезно поместить вариант использования в отдельный фрагмент кода, потому что таким образом у этого кода будет одна причина для изменения - если, конечно, вариант использования изменится. Он отличается от логики принятия решений или от логики валидации значений домена.

0 голосов
/ 14 сентября 2018

Гексагональная архитектура ничего не говорит о внутренней структуре шестиугольника.

Варианты использования подходят следующим образом:

Порты драйвера - это двухполосный вариант использования приложения (шестиугольник).Интерфейс варианта использования будет портом драйвера.Реализация варианта использования была бы классом внутри шестиугольника.

То, что приложение вызова Alistair - это не уровень приложения DDD, это бизнес-логика в целом, шестиугольник, отделенный от технологии.Если вы хотите сравнить со слоями DDD, шестиугольник придется разделить на два слоя: приложение и домен.Инфраструктурный слой DDD будет адаптерами вне шестиугольника.

Но шестиугольная архитектура ничего не говорит о DDD, это разные вещи.Вам решать, как приспособить DDD к гексагональной архитектуре.

Я написал статью о гексагональной архитектуре, если вы хотите исправить понятия:

https://softwarecampament.wordpress.com/portsadapters

Надеюсь, это поможет.

...