Я правильно понял порты и адаптеры / гексагональную архитектуру?

Архитектура портов и адаптеров направлена ​​на создание независимого кода. Уровень домена не зависит напрямую от уровня инфраструктуры, вместо этого он зависит от порта (интерфейса), а реализация порта находится на уровне инфраструктуры, верно?

Моя структура папок будет такой:

  1. Проект для моего пользовательского интерфейса

  2. Проект ядра приложения, который содержит службу приложений, доменные службы и доменные модели.

  3. Проект для портов: он содержит строго интерфейсы.

  4. Проект инфраструктуры, и у меня там есть постоянная папка.

Механизм доставки можно переключить (с консольного приложения на веб-приложение ...), и ядро ​​по-прежнему будет работать.

То же самое и с инфраструктурой: я мог бы однажды использовать entity framework, а затем переключиться на dapper, не вызывая изменений в ядре.

Пока все хорошо, или я что-то упустил по пути, или я упустил самое базовое понимание архитектуры?

Теперь код мудрый:

Если у меня есть консольное приложение, в котором мне нужно ввести команду, и оно создает клиента.

Класс из службы приложений, находящийся в основном проекте. Он использует внедрение зависимостей для доступа к реализации IPersistence.

    public class AddNewCustomer
    {
        private readonly IPersistence _persistence;

        public AddNewCustomer(IPersistence persistence)
        {
            _persistence = persistence;
        }

        public bool addToDb(customer customer)
        {
            return _persistence.add(customer);
        }

    }

Интерфейс в проекте порта.

    public interface IPersistence
    {
        bool add(Customer customer);
    }

Реализация в интерфейсном проекте.

    public class Persistence: IPersistence
    {
        public bool add(customer customer)
        {
           //inserts into DB
        }
    }

Предполагается, что проект порта будет посвящен исключительно интерфейсам? Как вы структурируете (структуру папок) свой проект портов и адаптеров?


person 57913    schedule 22.01.2019    source источник
comment
Я бы посоветовал вам прочитать эту электронную книгу, посвященную архитектуре.   -  person Henk Holterman    schedule 22.01.2019
comment
Обратите внимание, что слои , луковицы, детали и переходники все одинаковые.   -  person Steven    schedule 22.01.2019


Ответы (1)


Пока все хорошо, или я что-то упустил по пути, или я упустил самое базовое понимание архитектуры?

Постараюсь правильно выразиться. Надеюсь, это поможет.

Архитектура портов и адаптеров направлена ​​на создание независимого кода.

Это правда. Но это не главная цель «как таковая». Это способ достижения основной цели, которая состоит в том, чтобы иметь возможность тестировать приложение изолированно от внешних устройств (оборудования, программного обеспечения, людей и т. Д.), Которые выходят за рамки приложения.

Уровень домена не зависит напрямую от уровня инфраструктуры, вместо этого он зависит от порта (интерфейса), а реализация порта находится на уровне инфраструктуры, верно?

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

Проект ядра приложения, который содержит службу приложений, доменные службы и доменные модели.

Здесь я просто хотел бы прокомментировать, что шаблон гексагональной архитектуры ничего не говорит о внутренней структуре приложения (шестиугольнике).

Механизм доставки можно переключить (с консольного приложения на веб-приложение ...), и ядро ​​по-прежнему будет работать.

Это нормально. Консоль и веб-приложения - это адаптеры, управляющие приложением. Они используют порты драйверов (порты, которые предлагают функции приложения внешним субъектам).

Я мог бы однажды использовать entity framework, а затем переключиться на dapper, не вызывая изменений в ядре.

Это нормально. Они будут адаптерами для порта постоянства, который является управляемым портом (управляемый адаптер реализует управляемый порт для взаимодействия с внешним субъектом).

Предполагается, что проект порта будет посвящен исключительно интерфейсам? Как вы структурируете (структуру папок) свой проект портов и адаптеров?

У меня есть "модуль java 9" для шестиугольника (вы называете его Core). А порты - это пакеты модулей, которые я экспортирую. Каждый порт представляет собой пакет со служебным интерфейсом, определяющим операции порта. Но у вас может быть больше классов (представляющих аргументы операции, картографы, если вы не хотите открывать внутренние объекты внешнему миру, ...). Реализация зависит от вас.

Структура моей папки (пакетов java):

Шестиугольник:

[имя-приложения] .hexagon.internal = внутренняя часть приложения

[имя-приложения] .hexagon.driver. [имя-порта-драйвера] = один или каждый порт драйвера (API приложения)

[имя-приложения] .hexagon.driven. [имя-управляемого-порта] = один или каждый управляемый порт (SPI приложения)

Адаптер между портом и актером с использованием технологии:

[имя-приложения] .adapter.driver. [имя-порта-драйвера]. [имя-исполнителя]. [технология] = по одному для каждого адаптера драйвера

[имя-приложения] .adapter.driven. [имя-управляемого-порта]. [имя-исполнителя]. [технология] = по одному для каждого управляемого адаптера

Я написал статью о гексагональной архитектуре, в которой объясняю шаблон, и собираюсь опубликовать пример реализации. Если хотите прочитать, вот ссылка:

https://softwarecampament.wordpress.com/portsadapters

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

person choquero70    schedule 24.01.2019