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?
Por que você não armazena os IDs do produto na entidade do grupo? Dessa forma, você está lidando apenas com um único agregado que facilitará as coisas.
Você precisará implementar algum tipo de padrão de simultaneidade, por exemplo, se você optar pela simultaneidade otimista, basta adicionar uma propriedade de versão à entidade do Grupo e lançar uma exceção se as versões não corresponderem na atualização, ou seja,
Adicionar produto a um grupo
Muitos ORMs têm simultaneidade otimista incorporada usando IDs de versão ou carimbos de data e hora, mas é fácil criar seus próprios. Aqui está um bom post sobre como isso é feito no Nhibernate http://ayende.com/blog/3946/nhibernate-mapping-concurrency .
fonte