endo problemas para colocar a lógica do mundo real na camada de domínio D

pesar de ter estudadoDomain Driven Design há muito tempo, ainda existem alguns princípios básicos que eu simplesmente entend

Parece que toda vez que tento criar um ricodomain layer, Ainda preciso de muitosDomain Services ou um grossoApplication Layer, e acabo com um monte de entidades de domínio quase anêmicas sem lógica real nelas, além de "GetTotalAmount" e similares. O principal problema é que as entidades não estão cientes de coisas externas e é uma má prática injetar qualquer coisa nas entidade

Deixe-me dar alguns exemplos

1. Um usuário se inscreve em um serviço. O usuário persiste no banco de dados, um arquivo é gerado e salvo (necessário para a conta do usuário) e um email de confirmação é enviad

O exemplo com o email de confirmação foi discutido intensamente em outros tópicos, mas sem uma conclusão real. Alguns sugerem colocar a lógica em umapplication service que recebe umEmailService eFileService injetado a partir doinfrastructure layer. Mas então eu teria lógica de negócios fora do domínio, certo? Outros sugerem a criação de umdomain service que recebe oinfrastructure services injetado - mas nesse caso eu precisaria ter as interfaces doinfrastructure services dentro dedomain layer (IEmailService eIFileService) que também não parece muito bom (porque odomain layer não pode fazer referência ainfrastructure layer). E outros sugerem implementarventos de Domínio @Udi Dahan e, em seguida, solicitando que o EmailService e o FileService se inscrevam nesses eventos. Mas isso parece uma implementação muito flexível - e o que acontece se os serviços falharem? Deixe-me saber o que você acha que é a solução certa aqui.

2. Uma música é comprada em uma loja de música digital. O carrinho de compras está vazio. A compra é mantida. O serviço de pagamento é chamado. Uma confirmação por email é enviada.

Ok, isso pode estar relacionado ao primeiro exemplo. A questão aqui é, quem é responsável por orquestrar essa transação? Claro que eu poderia colocar tudo no controlador MVC com serviços injetados. Mas se eu quiser DDD real, toda a lógica de negócios deve estar no domínio. Mas qual entidade deve ter o método "Purchase"?Song.Purchase()? Order.Purchase()? OrderProcessor.Purchase() (serviço de domínio)?ShoppingCartService.Purchase() (serviço de aplicativo?)

Este é um caso em que acho muito difícil usar lógica de negócios real dentro das entidades do domínio. Se não é uma boa prática injetar nada nas entidades, como elas podem fazer outras coisas além de verificar seu próprio estado (e o de seu agregado)?

Espero que esses exemplos sejam claros o suficiente para mostrar os problemas com os quais estou lidand

questionAnswers(3)

yourAnswerToTheQuestion