Я начинаю с DDD и понимаю, что совокупные корни используются для обеспечения транснациональной согласованности. Мы не должны изменять несколько агрегатов в одном сервисе приложений.
Однако я хотел бы знать, как справиться со следующей ситуацией.
У меня есть совокупный корень под названием Продукты.
Существует также совокупный корень, называемый группой.
Оба имеют идентификаторы и могут редактироваться независимо.
Несколько продуктов могут указывать на одну и ту же группу.
У меня есть служба приложений, которая может изменить группу продуктов:
ProductService.ChangeProductGroup(string productId, string groupId)
- Проверка группы существует
- Получить продукт из хранилища
- Установить свою группу
- Написать продукт обратно в хранилище
У меня также есть служба приложений, где группа может быть удалена:
GroupService.DeleteGroup(string groupId)
1. Получить продукты из репозитория, для которого groupId установлен на предоставленный groupId, убедиться, что счетчик равен 0 или прервать 2. Удалить группу из репозитория групп 3. Сохранить изменения
Мой вопрос следующий сценарий, что произойдет, если:
В ProductService.ChangeProductGroup мы проверяем, что группа существует (она существует), затем сразу после этой проверки отдельный пользователь удаляет группу ProductGroup (через другой GroupService.DeleteGroup). В этом случае мы устанавливаем ссылку на продукт, который был только что удален?
Является ли это недостатком моего дизайна в том, что я должен использовать другой дизайн домена (при необходимости добавляя дополнительные элементы), или мне придется использовать транзакции?