CQRS / DDD Как добавить объект к агрегату с помощью команды?

Я новичок в CQRS / DDD, поэтому в моем понимании могут быть большие пробелы.

Но предположим, что у меня есть агрегатный объект Widget. Widget состоит из Note объектов, а к Note объектам может быть прикреплен File объект.

В CQRS у меня может быть команда AddNoteToWidget. Из моего чтения я знаю, что объекты команд и событий должны быть простыми DTO (я знаю, что они также могут быть в других формах, но главное, что они не содержат поведения).

Я также понимаю, что сущности никогда не должны содержать ссылки на репозитории, поскольку они не должны знать о сохранении.

Будет ли мой AddNoteToWidget содержать ссылку на объект File и просто сериализоваться вместе с командой? В этом случае мой объект File должен быть объектом значения. Однако я смоделировал его как объект со своим собственным репозиторием, потому что я хотел иметь централизованное согласованное хранилище файлов во всей системе.


person rgvcorley    schedule 28.10.2015    source источник
comment
Я бы не стал добавлять к вашей команде сериализованный файл. Вместо этого используйте имя файла / путь для новых файлов или используйте внутренний идентификатор файла (сущности) для существующего.   -  person Jehof    schedule 28.10.2015
comment
В заметке может быть ссылка на файл, а в addNoteToWidget не должно быть.   -  person Software Engineer    schedule 28.10.2015
comment
Я удалил последний абзац - SO не нравятся ответы только по ссылкам, и ваш вопрос был бы закрыт и удален, если бы он остался.   -  person Software Engineer    schedule 28.10.2015
comment
@Jehof Хорошо, если я использую идентификатор объекта File, мне тогда не понадобится ссылка на FileRepository в Widget. Или вы просто получите идентификатор файла и запросите FileRepository в клиентском коде?   -  person rgvcorley    schedule 28.10.2015
comment
@EngineerDollery, хорошо, значит, AddNoteToWidget может содержать строку для заметки, а затем идентификатор объекта File?   -  person rgvcorley    schedule 28.10.2015
comment
Не совсем, файлы не имеют ничего общего с виджетами. В заметке может быть ссылка на файл (идентификатор), который может присутствовать, когда вы добавляете заметку к виджету (или может отсутствовать, в зависимости от вашего дизайна), но виджет ничего не знает и не заботится о файлах.   -  person Software Engineer    schedule 28.10.2015
comment
@EngineerDollery, да, я так и думал. Но было бы неплохо, если бы Note при восстановлении из какой-либо персистентности имел фактическую ссылку на объект File, а не идентификатор, который потребовал бы, чтобы клиентский код запрашивал FileRepository. Однако я не понимаю, как это возможно, если я просто воспроизводю объекты команд, которые должны быть простыми DTO.   -  person rgvcorley    schedule 28.10.2015
comment
Предоставив ему репо, я думаю, вы смоделировали файл как совокупный корень, что означает, что к нему обращаются независимо, как вы упомянули. Это очень желательное качество, которое вы должны приветствовать, поскольку оно позволяет повторно использовать концепцию файла для многих различных классов сущностей и позволяет реализациям использовать микросервисные архитектуры, а также развертывать и масштабировать их независимо.   -  person Software Engineer    schedule 28.10.2015


Ответы (1)


Из прочтения вашего вопроса, а также из комментариев к нему становится ясно, что в настоящее время вы рассматриваете File как суб-объект и совокупный корень. Это проблема, вы должны решить одну из двух:

  1. Модель File как агрегат. Теперь вне этого агрегата должен использоваться только идентификатор File, а не сам File. Кроме того, File объектов извлекаются из собственного репозитория.
  2. Модель File как сущность в Widget агрегате. Это означает, что у вас всегда под рукой файл Widget. File объекты не имеют собственного репозитория, они загружаются вместе с Widget через WidgetRepository.

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

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

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

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

person theDmi    schedule 28.10.2015