Oi Cássio,
Achei pertinente o tópico. Meus dois centavos sobre isso:
Achei muito purista e meio YAGNI a estrutura de ter, além do domínio, um "modelo anêmico" apenas para representar as tabelas do banco. Confesso que já trabalhei assim, mas façamos uma reflexão:
Na prática, qual é o real benefício disto?
1) Você ganhou classes a mais para manter, ou seja, getters / setters para todos os lados (mesmo tendo o excelente AutoMapper para ajudar).
2) Se você escreve/escreverá testes para os repositórios terá que se preocupar em, no mínimo, mockar estas novas classes.
3) Potencial explosão de código repetido.
4) Você tem motivos a mais para os desenvolvedores da equipe ficarem divagando entre classes, sem realmente saberem o que estão fazendo (algo como "qual a diferença entre OrderBillingAddressType e OrderBillingAddressTypeDTO ?")
5) Motivos a mais para a lógica de negócio aparecer nestas classes anêmicas e não no domínio. Dificulta a manutenção e a facilidade com que percorremos o código. É shift+f12, ctrl+shift+f e f12 para todos os lados.
Com DDD ou sem DDD, precisamos considerar que é extremamente difícil conseguir Persistence Ignorance sem alterar a forma como escrevemos nossos POCOs. Isso vale não só para a forma como persistimos os objetos, mas até na forma como os validamos (se você utilizar DataAnnotations estaria igualmente quebrando este princípio).
É de se louvar que utilizando o NHibernate precisemos APENAS decorar os membros públicos com virtual e ter um default constructor com modificador de acesso protected. Dependendo da convenção de mapeamento teus objetos ainda terão de ter uma propriedade Id. Isso não impede em nada que escrevamos testes para os nossos objetos e repositórios sem nem sequer olhar para o banco.
Nos termos acima, teríamos UMA dll com a regra de negócio inteira, o "coração do software" (como diz a capa do livro do Evans), aquilo que deve permanecer por 5, 10 anos, independente das ViewModels do MVC, da persistência no MongoDB, dos UserControls do Silverlight ou de qualquer camada de aplicação/infraestrutura.
Para este tipo de decisão me inspiro no Rails/ActiveRecord, onde por exemplo nos focamos na construção de uma classe com propriedades e comportamento, a base da OO. No fundo sabemos que aquilo vai parar em um banco, pois tivemos que colocar ao lado do nome da classe um "< ActiveRecord::Base".
Para concluir, precisamos focar no que importa (negócio) e aceitar tecnologias que diminuam nossa dor de cabeça na hora de jogar as coisas para um banco, mesmo que isto custe um public virtual ou um protected NomeDaClasse().
[]s