Estou começando com o DDD e entendo que as raízes agregadas são usadas para garantir consistência transnacional. Não devemos modificar várias agregações em um serviço de aplicativo.
Gostaria de saber, no entanto, como lidar com a seguinte situação.
Eu tenho uma raiz agregada chamada Produtos.
Há também uma raiz agregada chamada Grupo.
Ambos têm IDs e podem ser editados independentemente.
Vários produtos podem apontar para o mesmo grupo.
Eu tenho um serviço de aplicativo que pode alterar o grupo de um produto:
ProductService.ChangeProductGroup(string productId, string groupId)
- O grupo de verificação existe
- Obter produto do repositório
- Defina seu grupo
- Escreva o produto novamente no repositório
Eu também tenho um serviço de aplicativo onde o grupo pode ser excluído:
GroupService.DeleteGroup(string groupId)
1. Obtenha produtos do repositório cujo groupId esteja definido como groupId fornecido, garanta que a contagem seja 0 ou aborte 2. Exclua o grupo do repositório de grupos 3. Salve as alterações
Minha pergunta é o seguinte cenário, o que aconteceria se:
No ProductService.ChangeProductGroup, verificamos se o grupo existe (existe) e, após essa verificação, um usuário separado exclui o productGroup (por meio de outro GroupService.DeleteGroup). Nesse caso, definimos uma referência a um produto que acabou de ser excluído?
Isso é uma falha no meu design, pois eu deveria usar um design de domínio diferente (adicionando elementos adicionais, se necessário) ou precisaria usar transações?