Прикладной уровень против доменного уровня?

47

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

Мои вопросы, поскольку оба они касаются логики приложения и должны быть чистыми от технических аспектов и аспектов представления, каковы преимущества проведения границы между этими двумя?

Луис Рис
источник

Ответы:

36

Я недавно прочитал DDD сам. Когда я попал в этот раздел, я был приятно удивлен, обнаружив, что обнаружил ту же четырехслойную архитектуру, что и Эванс. Как указал @lonelybug, доменный слой должен быть полностью изолирован от остальной системы. Однако что-то должно преобразовывать специфичные для пользовательского интерфейса значения (строки запроса, данные POST, сеанс и т. Д.) В доменные объекты. Это где прикладной уровень вступает в игру. Его задача - переводить туда и обратно между пользовательским интерфейсом, уровнем данных и доменом, эффективно скрывая домен от остальной части системы.

Сейчас я вижу много приложений ASP.NET MVC, где почти вся логика находится в контроллерах. Это неудачная попытка реализовать классическую трехслойную архитектуру. Контроллеры сложны для модульного тестирования, потому что у них очень много специфичных для пользовательского интерфейса проблем. На самом деле, написание контроллера таким образом, чтобы он не был напрямую связан со значениями «контекста Http», само по себе является серьезной проблемой. В идеале контроллер должен просто выполнять перевод, координировать работу и выплевывать ответ.

Может даже иметь смысл провести базовую проверку на прикладном уровне. Домен может предположить, что значения, входящие в него, имеют смысл (это действительный идентификатор для этого клиента и соответствует ли эта строка дате / времени). Однако проверка с использованием бизнес-логики (можно ли забронировать билет на самолет в прошлом?) Должна быть зарезервирована для уровня домена.

Мартин Фаулер на самом деле комментирует, насколько плоскими являются большинство доменных слоев в наши дни . Хотя большинство людей даже не знают, что такое прикладной уровень, он обнаруживает, что многие люди создают довольно тупые доменные объекты и сложные прикладные уровни, которые координируют работу различных доменных объектов. Я сам виноват в этом. Важно не создавать слой, потому что в какой-то книге вам сказали. Идея состоит в том, чтобы определить обязанности и разделить наш код на основе этих обязанностей. В моем случае «прикладной уровень» эволюционировал естественным образом, когда я увеличил модульное тестирование.

Трэвис Паркс
источник
9
Я не думаю, что то, что вы утверждаете здесь, является правильным: «Однако что-то должно преобразовывать специфичные для пользовательского интерфейса значения (строки запроса, данные POST, сеанс и т. Д.) В объекты домена. Именно здесь прикладной уровень вступает в игру». В терминах DDD вы имеете в виду слой "Presentation". Предполагается, что прикладной уровень решает проблемы с сантехникой, параллелизмом и сквозными задачами, являясь лишь крошечной оболочкой над доменным уровнем. То, что вы описываете, будет соответствовать (под) слою на уровне представления.
пожрал Элизиум
23

Исходя из моделей корпоративного дизайна Мартина Фаулера, наиболее распространенными являются следующие уровни:

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

  • Домен - это место, где находятся ваши бизнес-правила и логика, определены модели вашего домена и т. Д.

  • Источник данных - это слой отображения данных (ORM) и источник данных (база данных, файловая система и т. Д.)

Как вы рисуете границы между тремя слоями:

  • Не размещайте специфическую логику презентации в ваших моделях или объектах домена

  • Не размещайте логику на своих страницах и контроллерах, т. Е. Логику для сохранения объектов в базе данных, создания соединений с базой данных и т. Д., Что сделает ваш уровень представления хрупким и трудным для тестирования

  • Используйте ORM, который позволяет вам отделить доступ к источнику данных и действия от модели

  • Следуйте принципу «тонкий контроллер - толстая модель», контроллеры предназначены для управления процессом выполнения, а не для его выполнения, подробнее на http://www.littlehart.net/atthekeyboard/2007/04/27/fat-models-skinny-controllers/ и http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model модель, представление и контроллер,

Стивен Сенкомаго Мусоке
источник
17

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

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

К примеру , мое приложение финансового программного обеспечения операция пользователя для изменения состояния модельного объекта (объект , как это определенно в DDD [89]):

  • «Начальник производства может утвердить финансовое предложение».

Но, как процесс подачи заявки, помимо всех типовых последствий этой операции, я должен отправить внутреннее сообщение другим пользователям приложения. Эта работа "организована" на прикладном уровне. Я не хотел бы, чтобы мой уровень домена думал о направлении службы обмена сообщениями. (и, конечно, это не ответственность уровня презентации). Как бы то ни было, одно можно сказать наверняка: мне нужен новый уровень, так как уровень моего домена полностью связан с основным бизнесом, а уровень представления моих презентаций - интерпретация пользовательских команд и представление результатов.

Примечания:

  • Бизнес - это одно из тех слов, которые часто приводят к множественным интерпретациям его значения, но вы наверняка найдете много примеров и разговоров в DDD;
  • DDD расшифровывается как книга Эрика Эванса о доменном дизайне , а число в квадратных скобках обозначает номер страницы.
Хосе Андиас
источник
6

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

Предполагается, что прикладной уровень предназначен для предоставления некоторых функций о том, что может делать интерфейс системы (приложения) (например, API или RESTful). Например, пользователи могут войти в систему, и в этом действии приложения (вход в систему) коды прикладного уровня будут кодами клиента для уровня домена (или уровня инфраструктуры), в котором извлекается объект домена пользователя и применяются методы этого объекта для реализации функция входа в систему.

Уровень приложения также должен быть спроектирован как уровень изоляции, а это означает, что на поведение приложения не должны влиять какие-либо изменения кода (на уровне представления, на уровне домена и на уровне инфраструктуры).

stevesun21
источник
2
По крайней мере, в литературе, такой как Domain-Driven Design (Evans), общепризнанно, что уровни имеют одностороннюю зависимость ... в действительности, в какой-то момент ваш код зависит от чего-то . Пользовательский интерфейс зависит от приложения, но не наоборот. Приложение зависит от домена, но не наоборот. Домен в инфраструктуре, а не наоборот.
1
Зависимость - это то, как ваше программирование, уровень изоляции - это то, как вы проектируете свои системные уровни. Односторонняя зависимость здесь не нарушает концепции изоляции, потому что при программировании код верхнего уровня должен зависеть от интерфейса нижнего уровня, а не от классов реализации.
stevesun21
Это замечательно, и все на бумаге, но на практике бизнес-требования приводят к изменениям, которые могут повлиять на интерфейс прикладного уровня таким образом, что изменения всплывают на уровне представления, а иногда и на уровне хранения. Это все, что я получал ...
Конструкция изоляционного слоя не означает, что в будущем не допускаются изменения. Наоборот, это делает изменения намного проще - легче тестировать и легче оценивать работы. Да, новое бизнес-требование означает, что вам может потребоваться перейти с верха на низ, разве вы не реализовали ранее существующую функцию? Если вы можете спроектировать каждый слой на основе принципов SOLID, то вы можете обнаружить, что можете просто повторно использовать существующие функции из нижнего слоя.
stevesun21
3

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

Это позволяет вам сосредоточиться на самом домене без отвлекающих факторов (таких как координация между пользовательским интерфейсом и постоянными службами).

Одед
источник
Тогда источник данных (ORM) находится внутри домена?
Майконн
@ Майконн - Может быть. Однако ORM не является источником данных. Это инструмент между вашим кодом и фактическим источником данных (реляционная база данных). То, как вы получаете доступ к данным, не должно беспокоить домен - с этим могут справиться строители и фабрики (и ORM, если он у вас есть).
Одед
Я согласен. И я был неправ насчет источника данных и ORM. Спасибо!
Майконн
3
  • Слой приложений и домны уровень и подпадают под объемом реализации.
  • Уровень приложений действует как API.
  • Уровень домена действует как реализация API, он содержит бизнес-логику, поэтому он также называется уровнем бизнес-логики.

введите описание изображения здесь

Premraj
источник
никогда не думай об этом таким образом ... Я чувствую себя просветленным
Никос
2

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

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

Конечная цель - сделать ваш код максимально простым в обслуживании.

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

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

Чарльз Ламберт
источник
Мне было любопытно, как разместить логику авторизации, и из того, что я пытаюсь понять, она вписывается в «прикладной уровень». Не могли бы вы поделиться какой-то информацией о том, почему, возможно, было бы не лучше содержать это в этом слое логики?
1
Это идеальный тип вопроса для этого сайта. Вы должны опубликовать это, чтобы у каждого был шанс ответить.
Чарльз Ламберт
@tuespetre Не могли бы вы предоставить ссылку на этот пост?
Drizzie