2013-07-12 5 views
3

Рассмотрим веб-приложение с уровнем хранилища (постоянством), уровнем обслуживания (приложения) и веб-интерфейсом (UI).Архитектура. Где поставить класс обслуживания, который не зависит от какого-либо другого компонента сервиса или репозитория.

Рассмотрите компонент (т. Е. ExternalProgramExecutor), который не является компонентом пользовательского интерфейса и не зависит от какого-либо компонента из уровня сервиса или уровня репозитория.

Вопрос являются:

  • Принадлежит ли этот компонент в уровне услуг?
  • Этот компонент относится к уровню сохранения?
  • Следует ли обрабатывать отдельно от этих слоев? Если да, то каково название этой части архитектуры?

ответ

4

Задайте себе следующие вопросы:

  • ли это сохраняющееся что-то?
  • Предоставляет ли это услугу?
  • Эти вещи особенно важны для вашего приложения?

Ответ на первый вопрос должен быть не так, поскольку вы уже сказали нам, что компонент не подключен к приложению каким-либо образом.

Ответ на второй вопрос должен быть да, так как это то, что предоставляют все хорошие программные компоненты: какой-то сервис.

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

Веб-архитектура - это всего лишь организационный механизм. Если вы пытаетесь найти ответ в One True Web Architecture Reference ™, вы найдете doingitwrong.

0

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

0

Концептуально, 'ExternalProgramExecutor' выглядит как сервис, поэтому он относится к сервисному слою.

Чтобы перейти в деталях уровня службы, есть две возможности:

  1. Услуга «ExternalProgramExecutor» имеет ту же природу, что и другие услуги, так что это еще одна «буллит» слоя службы ,
  2. Служба сильно отличается от других, это еще один «блок» сервисного уровня.

Это разъединение остается с более прагматической точки зрения (реализации):

  1. Служба опирается на те же функции (тот же пользовательский интерфейс, такой же доступ к персистенции): она должна быть интегрирована с другими части сервисного уровня, использовать их API ...
  2. Служба по своей сути автономна: это шанс, не создавать ненужные зависимости, развивать его независимо.
1

Лично я хотел бы добавить еще один вопрос к списку вопросов @Robert спросил:

  1. Это полностью зависит от моего приложения?

Для меня обычно я добавляю новый компонент Utility/Framework в свою архитектуру, где я помещаю полностью независимые компоненты, которые могут быть повторно использованы в других приложениях позже.

0

Я имею тенденцию рассматривать сервисы как интерфейсы над вашими моделями домена, и поскольку это звучит так, что отношения не существуют, это не похоже на услугу в этом смысле.

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

И какой слой он принадлежит? Нужно ли это принадлежать одному? Задавая такие вопросы, похоже, что вы уже нашли время, чтобы правильно организовать свои объекты. Если у вас есть один посторонний компонент, вы можете либо:

А) поместите его в слой, где он используется наиболее

B) бросьте его в своей собственной сборки и перестать беспокоиться о маркировке это :)

0

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

  1. Разделение обязанностей.
  2. Легко видеть рабочий процесс.
  3. Возможность замены уровней с минимальными усилиями.

С точкой 3, если изменение "ExternalProgramExecutor" не требует любого изменений на других слоях. Думаю, это заслуживает самого себя. Я использовал слой под названием «Ext» для проекта с аналогичной целью.

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

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

1

Согласно DDD, этот вид услуг - что, кажется, усвояемых к услугам "Util/Helper" - должен быть в "Инфраструктура слоя" (ЦСИ: InfoQ)

Архитектура

типичная архитектура корпоративных приложений состоит из следующих четырех концептуальных слоев:

  • Пользовательский интерфейс (Уровень презентации): Ответственный за представление информации пользователю и интерпретации пользовательских команд .
  • Application Layer: Этот слой координирует активность приложения. Это не содержит любую бизнес-логику. Он не поддерживает состояние бизнеса объектов, но он может удерживать состояние выполнения задачи приложения.
  • Domain Layer: Этот уровень содержит информацию о рабочем состоянии . Здесь хранится состояние бизнес-объектов. Сохранение бизнес-объектов и, возможно, их состояние делегируется на уровень инфраструктуры .
  • Инфраструктурный слой: Этот слой действует как поддерживающая библиотека для всех остальных слоев. Она обеспечивает связь между слоями , реализует сохранение для бизнес-объектов, содержит поддерживающие библиотеки для уровня интерфейса пользователя и т.д.
0

Ну, ExternalProgramExecutor услуга сама по себе, так как ваше приложение использует это как a внешний компонент.

Очевидно, что вы не можете поместить эту услугу в свое приложение, если вы не собираетесь размещать source code этого компонента в рамках проекта вашего приложения. Таким образом, у вас на самом деле будет Gateway над этим сервисом/компонентом в вашем проекте. Чтобы сделать это SOLID, ваш шлюз будет аннотация, и на ваш вопрос , где вы должны указать этот абстрактный шлюз.

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