Агрегированные корневые ссылки на другой агрегированный корень по идентификатору, как сохранить целостность с помощью RavenDB?
Скажем, у меня X в качестве совокупного корня, а Y в качестве другого совокупного корня. Используя базу данных документов NoSql, X содержит ссылку на Y по идентификатору Y. Если Y удален (независимо от контекста X), то X содержит ссылку на Y, который не существует.
Что такое предлагаемое решение для устранения или решения этой проблемы в DDD?
3 ответа
Операция удаления должна иметь деловое значение. Например, то, что кто-то удалил продукт из коллекции инвентаризации, не означает, что он должен быть удален из счетов пользователей.
Если есть реальная необходимость удаления. Вы всегда можете определить индекс в RavenDB и обновить сущности, содержащие этот агрегированный корневой ID.
Я не знаю, говорит ли DDD о вашей проблеме напрямую, но предлагаемое "решение" может лежать в доменных событиях / обмене сообщениями. Если связанный агрегат находится в одном и том же ограниченном контексте, может оказаться достаточным событие домена, в противном случае вам может понадобиться инфраструктура обмена сообщениями для связи с другим ограниченным контекстом.
То, что происходит, когда вы получаете "удаленное" событие, - это отдельная история, и, возможно, эксперты вашего домена могут помочь. Как говорит @Dmitry S., вам может потребоваться денормализовать связанные данные агрегатов в объект значения, чтобы у вас было достаточно информации для поддержания согласованности основного агрегата. При обработке события "удалено" вам может потребоваться установить какой-либо индикатор в вашем основном агрегате или каким-либо образом обновить данные, чтобы отразить удаление.
Зачем вам удалять агрегат? Вы можете хотеть Expire() это или Suspend(). Деактивировать (), отключить (), запретить (), отменить (), завершить () или архивировать (). Но какую выгоду вы получите от потери данных с помощью Delete()?
Если вам это действительно нужно (возможно, в юридических целях), возможно, следует создать какой-нибудь EvaporaitonService, и он найдет все связанные агрегаты и удалит все ссылки.