Подтвердить что ты не робот

Можете ли вы предложить лучшие методы DDD?

Вероятно, подобные вопросы задавались много раз, но я думаю, что каждый ответ помогает лучше понять и понять DDD. Я хотел бы описать, как я воспринимаю некоторые аспекты DDD. У меня есть некоторые основные неопределенности вокруг него, и я был бы признателен, если бы кто-то мог дать солидный и практичный ответ. Обратите внимание, что эти вопросы предполагают "классический" подход к DDD. Это означает использование ORM и т.д. Подходы, такие как CQRS и источники событий, здесь не рассматриваются.

  • Агрегаты и сущности являются первичными объектами, реализующими логику домена. У них есть состояние и идентичность. В этом контексте я воспринимаю логику домена как совокупность всех команд, которые мутируют это состояние. Имеет ли это смысл? Почему логика домена связана исключительно с государством? Является ли законным моделировать объекты домена, которые не имеют идентификатора или не имеют состояния? Почему объект домена не может быть реализован как транзакция script? Пример. Рассмотрим объект, который рекомендует вам партнера для сайта знакомств. У этого объекта нет реального состояния, но в нем довольно много логики домена? Помещение этого в сервисный уровень подразумевает, что модель домена не может охватить всю логику.

  • Доступ к другим объектам домена. Может ли агрегат иметь доступ к репозиторию? Пример. Когда объект (stateful) домена должен иметь доступ ко всем "пользователям" системы для выполнения своей работы, ему потребуется доступ к ним через репозиторий. Как следствие, ORM нужно будет вводить репозиторий при загрузке объекта (что может быть технически более сложным). Если объекты не могут иметь доступ к репозиториям, где бы вы поместили логику домена для этого примера? В служебном слое? Разве не должен быть логический уровень сервиса?

  • Агрегаты и сущности не должны разговаривать с внешним миром, их беспокоит только ограниченный контекст. Мы не должны вводить внешние объекты (например, IPaymentGateway или IEmailService) в объект домена, это приведет к тому, что домен обрабатывает исключения, поступающие извне. Решение: основанный на событиях подход. Как вы отправляете события? Вам все равно нужно вводить правильные "слушатели" каждый раз, когда вы создаете объект домена. ORM - это восстановление "данных", но они не предназначены для инъекций. Нужна ли нам комбинация DI-ORM?

  • Объекты домена и DTO. Когда вы запрашиваете корень агрегата для своего состояния, он возвращает проекцию своего состояния (DTO) или самих объектов домена? В большинстве моделей, которые я вижу, клиенты имеют полный доступ к модели данных домена, внося глубокую связь с фактической структурой домена. Я воспринимаю "граф объектов" за совокупностью как свой собственный бизнес. Это инкапсуляция, не так ли? Поэтому для меня совокупный корень должен возвращать только DTO. DTO часто определяются на уровне сервиса, но мой подход заключается в моделировании его в самом домене. Уровень обслуживания может все же добавить еще один уровень абстракции, но это другой выбор. Это хороший совет?

  • Репозитории обрабатывают все операции CRUD на уровне совокупного корня. Как насчет других запросов? Запросы возвращают объекты DTO, а не объекты домена. Чтобы это сработало, репсор должен знать структуру данных домена, которая вводит связь. Мой совет аналогичен предыдущему: используйте события для заполнения представлений. Таким образом, внутренняя структура не становится общедоступной, только события содержат необходимые данные для создания представления.

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

  • Логика Buisness не является логикой домена. С точки зрения бизнес-реализации реализация прецедента может включать в себя множество шагов: Регистрация клиента, отправка электронной почты, создание учетной записи хранилища и т.д. Этот общий процесс может оказаться несовместимым с корнем домена. Объект домена должен иметь доступ ко всей инфраструктуре. Решение: рабочие процессы или саги (или транзакция script). Это хороший совет?

Спасибо

4b9b3361

Ответ 1

Несмотря на мой комментарий выше, я взял удар в ваши очки. (примечание: я не Эрик Эванс или Джимми Нильссон, поэтому принимайте мои "советы" с солью).

  • Пример "Рассмотрите объект, который рекомендует вам партнера для сайта знакомств". Он принадлежит службе домена (а не службе инфраструктуры). См. Эту статью здесь - http://lostechies.com/jimmybogard/2008/08/21/services-in-domain-driven-design/

  • Агрегаты не имеют прямого доступа к репозиториям, но они могут создать единицу работы, которая объединяет операции с несколькими объектами домена в один.

  • Не уверен в этом. Это действительно должно быть вопросом само по себе.

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

  • Я не уверен, что вы подразумеваете под "запросами". Если моделирование всех возможных сценариев "чтения" в вашем домене не кажется практичным или обеспечивает достаточную производительность, это говорит о том, что решение CQRS, вероятно, лучше всего.

  • Да, я согласен. UOW - это инструмент в панели инструментов, который можно использовать в разных слоях.

  • Это утверждение в корне неверно. "Бизнес-логика - это не логика домена". Домен IS является бизнес-логикой представления, поэтому одной из причин использования ubiquitous language.

Ответ 2

Первая лучшая практика, которую я могу предложить, - прочитать книгу Эванса. Дважды.
Слишком много "DDD-проектов" терпят неудачу, потому что разработчики притворяются, что DDD - это просто ООП, сделанный правильно.

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

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

Наконец, вы можете найти полезные моделирование, описанные здесь.