A resposta mais útil foi dada por Alexey Zimarev e conseguiu pelo menos 7 votos positivos antes que um moderador a movesse para um comentário abaixo da minha pergunta original ....
Sua resposta:
I would recommend you to watch Jimmy Bogard's NDC 2012 session "Crafting Wicked Domain Models" on Vimeo. He explains what rich domain should be and how to implement them in real life by having behaviour in your entities. Examples are very practical and all in C#.
Eu tomei algumas notas para resumir o vídeo para o benefício da minha equipe e fornecer detalhes um pouco mais imediatos neste post. (O vídeo tem uma hora de duração, mas vale muito a pena se você tiver tempo. Jimmy Bogard merece muito crédito por sua explicação.)
- "Para a maioria das aplicações ... não sabemos que elas serão complexas quando começarmos. Elas acabam se tornando assim."
- A complexidade cresce naturalmente à medida que o código e os requisitos são adicionados. As aplicações podem começar de forma muito simples, como o CRUD, mas o comportamento / regras podem ser incorporados.
- "O bom é que não precisamos começar de maneira complexa. Podemos começar com o modelo de domínio anêmico, que é apenas um pacote de propriedades, e com apenas técnicas de refatoração padrão podemos avançar para um verdadeiro modelo de domínio." li>
- Modelos de domínio = objetos de negócios. Comportamento do domínio = regras de negócios.
- O comportamento é geralmente oculto em um aplicativo - pode estar em PageLoad, Button1_Click ou frequentemente em classes auxiliares como 'FooManager' ou 'FooService'.
- As regras de negócios que são separadas dos objetos de domínio "exigem que nos lembremos" dessas regras.
- No meu exemplo pessoal acima, uma regra de negócios é WorkItem.StatusHistory.Add (). Não estamos apenas alterando o status, estamos arquivando para auditoria.
- Comportamentos de domínio "eliminam erros em um aplicativo com muito mais facilidade do que apenas escrever vários testes". Os testes exigem que você saiba escrever esses testes. Os comportamentos do domínio oferecem-lhe os caminhos corretos para testar .
- Os serviços de domínio são "classes auxiliares para coordenar atividades entre diferentes entidades de modelo de domínio".
- Serviços de domínio! = comportamento do domínio. Entidades têm comportamento, serviços de domínio são apenas intermediários entre as entidades.
- Objetos de domínio não devem ter a infraestrutura necessária (por exemplo, IOfferCalculatorService). O serviço de infraestrutura deve ser passado para o modelo de domínio que o utiliza.
- Modelos de domínio devem se oferecer para lhe dizer o que podem fazer, e eles só devem ser capazes de fazer essas coisas.
- As propriedades dos modelos de domínio devem ser protegidas com setters privados, para que apenas o modelo possa definir suas próprias propriedades, por meio de seus próprios comportamentos . Caso contrário, é "promíscuo".
- Objetos de modelo de domínio anêmico, que são apenas pacotes de propriedades para um ORM, são apenas "um verniz fino - uma versão strongmente tipada sobre o banco de dados".
- "Por mais fácil que seja obter uma linha de banco de dados em um objeto, é isso que temos."
- 'A maioria dos modelos de objetos persistentes é apenas isso. O que diferencia um modelo de domínio anêmico de um aplicativo que realmente não tem comportamento é se um objeto tiver regras de negócios, mas essas regras não são encontradas em um modelo de domínio. '
- "Para muitas aplicações, não há necessidade real de construir qualquer tipo de camada lógica de aplicativos de negócios reais, é apenas algo que pode falar com o banco de dados e talvez alguma maneira fácil de representar os dados que estão lá."
- Em outras palavras, se tudo o que você está fazendo é o CRUD sem objetos de negócios especiais ou regras de comportamento, você não precisa de DDD.
Por favor, sinta-se livre para comentar com qualquer outro ponto que você achar que deva ser incluído, ou se você acha que alguma dessas notas está fora do alvo. Tentei citar diretamente ou parafrasear o máximo possível.