Агрегат моделирования DDD с несколькими инвариантами и множеством полей

Я думаю о моделировании агрегатов, инвариантов, данных и т. д. Существует общий совет проектировать агрегаты небольшими. У меня проблема с правильным разбиением домена и простым CRUD. Предположим, что у нас есть приложение, в котором мы умеем создавать проект и присоединять к нему соавторов. Есть много информации, связанной с проектом на этапе создания (название, описание, проект_цели, примечания, дата создания, дата изменения, соавторы). Как исправить совокупность дизайна, где есть правило, проверяющее, что мы можем добавить только 5 соавторов. Принимая во внимание, что имя полей, описание, проект_цели, примечания на самом деле не участвуют ни в одном бизнес-правиле, и есть только требования, чтобы эти поля не были пустыми (это действительно инварианты?), должны ли эти поля действительно быть частью агрегат?

Разве наш настоящий Домен (агрегаты, сущности, объекты-значения, политики) не должен содержать только данные, которые участвуют в защите инвариантов или помогают принимать бизнес-решения? Если да, то как (создать) описанный выше проект? Должен ли класс со всеми этими несущественными (с точки зрения бизнеса) полями быть реализован как анемичная модель за пределами домена, а корень агрегата должен просто иметь метод addCollaborator, который защищает количество соавторов? Это хорошая идея, чтобы сохранить анемичный объект класса с помощью Dao (работает с таблицей db) и для доменной реализации агрегата создать репозиторий?

Как добавить первого соавтора при создании проекта, так как в начале мы создаем анемичный объект класса вне домена?

Спасибо за любую помощь и совет Papub


person Papub    schedule 15.01.2021    source источник


Ответы (1)


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

Project AR, скорее всего, поддерживает набор соавторов и выбрасывает, когда его размер превышает 5.

есть только требования, чтобы эти поля не были пустыми (это действительно инварианты?)

Да, это могут быть простые правила, но они все же являются инвариантами.

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

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

реализованная как анемичная модель за пределами домена, и корень агрегации должен просто иметь метод addCollaborator, который защищает количество соавторов.

Вы всегда можете попытаться смешать CRUD-управляемую анемию с богатыми всегда валидными моделями, но решение по анемичной/богатой модели обычно соответствует заданному ограниченному контексту (BC), что означает, что у вас могут быть CRUDDy BC и BC с богатой доменной моделью, но редко обе стратегии в одном БК.

Например, возможно, Project Definition — это CRUD-управляемый BC, а Collaboration — нет. Эти BC могут не иметь никакого смысла, но это просто пример.

Кроме того, не забывайте, что тактические шаблоны DDD позволяют управлять сложностью, это не жесткие правила. Если вы обрабатываете часть вашего AR через сервисы, а другую (где больше мяса) с богатым поведением, то, возможно, это приемлемо. Тем не менее, я, вероятно, предпочел бы CRUDDy поведение на самих AR, как метод update, а не сдаваться в анемичном направлении.

person plalx    schedule 22.01.2021