Обновление объекта значения из агрегата в отношении один-ко-многим - PullRequest
0 голосов
/ 03 марта 2020

Я недавно погрузился в DDD, и этот вопрос начал меня беспокоить. Например, взгляните на сценарий, упомянутый в следующей статье :

enter image description here

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

Ответы [ 2 ]

1 голос
/ 04 марта 2020

DDD подчеркивает вездесущий язык, и многие модельные вопросы, подобные этим, будут получать ответ прямо из этого языка. Перво-наперво, если есть агрегат, который содержит объект значения, есть большая вероятность, что объект значения не создан пользователем напрямую. Таким образом, фабрика, которая создает объект значения, живет в API агрегатов. Объект (ы) значения могут даже быть получены непосредственно из агрегатного состояния, а не из любого прямого вызова метода. В этом случае вы хотите просто отбросить совокупность и создать новую? Это может иметь смысл в зависимости от вашего UL .

В некоторых случаях, например, если у вас есть объекты неизменяемых значений (на основе вашего UL), вы можете просто добавить новую запись в запись журнала которая "переворачивает" старую запись . Примером этого могут быть банковские счета и транзакции. Если банковские счета представляют собой совокупные корни, а транзакции являются объектами стоимости. Если транзакция ошибочно введена, вы можете просто написать обратную транзакцию, чтобы аннулировать ее.

Вполне возможно, что вы хотите обновить объект значения, но это должно иметь смысл в вашем UL, и его реализация также должна быть вокруг вашего UL. Например, если у вас есть приложение планирования, а агрегат root - это расписание человека, а объектами значения являются собрания. Если пользователь ошибочно входит в собрание, ваша совокупность root должна сделать недействительным старое собрание (пометить флажок, отметить его отмененное состояние и т. Д. c) и создать новое. Эти действия соответствуют UL для вашего приложения планирования. То же самое, что вы называете «обновлением записи» выше.

1 голос
/ 03 марта 2020

Это действительно зависит. Если это последовательность оценок, которую вы добавляете каждый раз, вы вполне можете представить операцию, которая обновляет значение только VO. Это будет использовать семантику VO (VO вызывается для клонирования себя в-mem с обновленным значением в свойстве Speci c), а команда может быть просто оценкой (вместе с идентификатором задачи).

Если у вас есть массив VO, которые все семантически применимы к Task (а не только к «последним» или что-то в этом роде) ... это другой вопрос. В этом случае вам, вероятно, придется отправить все из них в запросе, и вам нужно будет также включить все свойства, но я бы сказал, что необходимость изменить только одно, вероятно, подразумевает необходимость ссылки на них, что, в свою очередь, подразумевает необходимость иметь сущность вместо ВО.

...