15

Одна вещь заранее: я прибываю из N-слоистого фона.Лук против N-слоистой архитектуры

я теперь потратил довольно немного времени получать мою голову вокруг Луковый архитектуры и связанных с доменными Driven концепций, таких как шестиугольная Архитектура чтения ресурсов, как Jeff Palermo's series of blog posts, Mark Seemann's contribution from a DI-perspective, "Onion-izing your achitecture" и "The clean architecture".

Что все эти статьи имеют в общем является то, что они утверждают, что следующие пункты:

  • Фокус сохраняется вокруг модели предметной области бизнес-прецедента
  • Неудачник связь между слоями, подчеркивая Dependency Inversion Принцип
  • Повышение независимости внешних инфраструктур, таких как рамки, сохраняемость данных, пользовательский интерфейс
  • Лучше проверяемость/ремонтопригодность

Хорошо, что все звучит невероятно хорошо, и эти диаграммы выглядят также сладкими. Но вопрос, который возникает для меня: не все ли это достигается простым добавлением фасадов в мою традиционную N-многоуровневую архитектуру?

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

Пожалуйста, помогите мне понять истинные преимущества архитектуры, ориентированной на домен.

Заранее благодарен!

+0

Что вы подразумеваете под: «Конкретные реализации могут сохраняться внутри каждого слоя и, следовательно, находиться в одном месте с абстракциями»? Архитектура лука собирается продвигать реализацию, насколько это возможно. – Dzenan

+0

Да, я знаю об этом. Но я думаю, что это также может привести к путанице, особенно для новых разработчиков. Если они работают только с абстракциями, но фактические реализации находятся в совершенно другом месте/слое. Вот почему я указал, что с архитектурой N-layerd с фасадами абстракции будут в том же месте, что и их реализация. –

ответ

4

Добавление фасадов - действительно первый шаг в построении архитектуры лука из n-слоистой архитектуры. Итак, да, вы можете сразу получить много преимуществ.

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

+0

Спасибо за этот ответ. Это помогло мне разобраться в чем-то еще. Не могли бы вы, возможно, подробнее остановиться на вопросах, касающихся тестирования? Мои классы все еще просто определяют свои зависимости через интерфейсы в своих конструкторах. Конкретные реализации будут введены через контейнер IoC. Почему тестовая сборка не может вводить ложные объекты этих интерфейсов в тестируемый класс одинаково? Он также имеет доступ к интерфейсам сборки. –

+0

Если ваши внешние слои уже используют IOC для ввода их зависимостей, то вы уже достигли луковой архитектуры. Если у вас есть внутренние слои, предоставляющие свои собственные IOC, вам нужно будет сообщить каждому из них о том, как они будут тестироваться/использоваться. Это преимущество перемещения элемента управления клиенту (внешние слои). Это позволяет внутренним слоям быть не осведомленными о том, как они используются, и позволяет внешним слоям справляться с этим. –

+4

Ну, это не «на самом деле» луковая архитектура, как я ее понял, поскольку в моем решении уровень представления только ссылки (интерфейсы) BLL, который, в свою очередь, только ссылается (интерфейсы) DAL. В Onion, продвигаемом Джеффом Палермо, PL может напрямую ссылаться на интерфейсы абстракции данных, правильно? –

0

У меня такое же мнение, как и у вас. Мы планируем начать новый проект, и один из моих сотрудников предложил луковую архитектуру, но после немного документирования я немного смутился, потому что (для меня!) тот факт, что каждый клиентский слой должен зависеть только от абстракции используемого слоя, является вопросом лучшей практики, который всегда должен иметь в виду любую архитектуру, которую мы планируем использовать, DI - это «Принцип», а не архитектура поэтому я не мог понять, как просто использование архитектуры N-Layered с «хорошими принципами OO» делает ее новой архитектурой?

Таким образом, мы закончим сотнями новых архитектур, объединив всех руководителей OO и шаблонов Go4 в Архитектуры приложений Entreprise.

0

Чтобы ответить на ваш вопрос напрямую «Не все ли это достигается путем простого добавления фасадов в мою традиционную N-многоуровневую архитектуру?». Ответ - да, и нет, в зависимости от вашего варианта использования.

В центре внимания архитектуры лука при использовании инверсии зависимостей, как вы сказали, «создайте ослабление связи». Тем не менее, это не только ради потери связи. Это может помочь подумать об этом как о «защите частей вашего кода, которые в наименьшей степени могут измениться, от частей, которые с большей вероятностью изменятся». Итак, для вашего случая, изменения «ниже» на фасаде потребуют изменений в вашем «доменном» коде? Может ли изменение, скажем, объекта базы данных, вносить изменения в объект, используемый в фасаде, а затем в ваш «доменный» код? Если ответ на эти типы вопросов «нет», то ваше предположение верно, для этого кода нет значимой функциональной разницы. Если кто-то должен был ответить «возможно», тогда они могут воспользоваться рефакторингом от фасадов до МОК.

1

Хотя это очень старый вопрос, но хотелось бы что-то добавить.

Onion Vs Layered

Эта статья объясняет, почему ясно слоистые не является предпочтительным, но если вы правильно реализованы МОК, он не собирается делать никакой разницы.