Каковы различия между ними, если таковые имеются?
Лук: Существуют слои с зависимостями, всегда указывающими внутрь, т. Е. Слой может использовать любойслоев внутри него.Внутренний слой - это Модель предметной области, а внешний - инфраструктура, но число слоев между ними может варьироваться.
Гексагональная (это альтернативное название для исходного названия «Порты и адаптеры»):Там нет слоев.У вас есть приложение, порты и адаптеры.Порты принадлежат приложению, они являются API / SPI приложения.Адаптеры находятся за пределами приложения, и каждый из них зависит от порта приложения.
У некоторых людей возникает путаница в том, что при реализации гексагональной архитектуры большинство людей физически не помещает каждый адаптер в артефакт, ноони объединяют все в один артефакт (например, слой инфраструктуры).Кроме того, они зависят от адаптеров во всем приложении, а не только от порта, который они используют.Так что на самом деле это будет Onion.
Реализация гексагонального права должна отделять адаптеры друг от друга, и каждый адаптер должен зависеть только от порта, который он использует / реализует (в зависимости от того, является ли порт драйверным или управляемым).
Другое отличие состоит в том, что шестиугольник ничего не говорит о структуре внутренней части шестиугольника (приложения).
Каковы преимущества использования одного над другим?
Преимущество шестиугольника в том, что он более модульный, у вас есть четкое разделение компонентов, предотвращающее утечку кода между ними.С другой стороны, лук в этом смысле более опасен, поскольку вы можете получить доступ, например, к базе данных непосредственно из пользовательского интерфейса (они оба принадлежат к одному и тому же слою).
Преимущество Onion вытекает из вышеизложенного.Поскольку в гексагональной структуре много артефактов, если проект большой, сборка всего проекта должна занимать много времени.
Почему вы используете его?когда его использовать?
Смысл использования любого из них заключается в том, что вы сосредотачиваетесь на реальной проблеме, которую пытаетесь решить, не используя какие-либо технологии или рамки.Приложение не зависит от технологий, и его легко перенести с одного фреймворка на другой.Из-за этого их обоих называют «чистыми» архитектурами.В ядре приложения нет кода платформы, аннотаций и т. Д.
Итак ... Зачем их использовать?
Поскольку вы улучшаете удобство сопровождения, тестируемость и получаете чистый код.
Когда их использовать?
Я бы лучше сказал, когда их не использовать.Если приложение, которое вы разрабатываете, не является сложным, например, это просто CRUD, возможно, оно не заслуживает их использования.
Лично мне больше нравятся "Порты и адаптеры", чем другие.
Надеюсь, что мое объяснение помогло.