portanto, seria impossível mudar para outro ORM (não que quiséssemos)).
Isso parece errado. Uma grande vantagem do padrão de repositório é que você oculta a lógica de acesso a dados e é facilmente trocável.
Até agora, parece que eu coloquei minha lógica de negócios no meu modelo de domínio e, através de repositórios, eu trabalharia com o ORM (o que quer que eu tenha escolhido). No entanto, se eu quisesse continuar usando a ferramenta MDA para a parte ORM do aplicativo, o modelo criado aqui seria muito anêmico (ou seja, não conteria nenhuma lógica comercial). Da mesma forma, se eu usasse o Entity Framework (.net) ou NHibernate para o meu ORM, também seria um modelo anêmico. Não sei onde você colocaria a lógica de negócios se eu apenas usasse o NHibernate.
Um modelo de domínio anêmico é considerado uma prática ruim por muitos, por exemplo, por Martin Fowler. Você deve evitar esse design, porque esse modelo leva a técnicas de design procedurais, em vez de um bom design orientado a objetos. Você tem classes de dados e classes de gerente / processamento, o que significa que você separou estado e comportamento. Mas um objeto realmente deve ser "estado e comportamento".
O NHibernate faz um ótimo trabalho na ignorância da persistência. Você pode ocultar os detalhes do mapeamento em XML ou com o FluentNHibernate e apenas escrever POCOs simples. É muito fácil criar um modelo de domínio avançado com o NHibernate. Eu acho que você pode fazer isso com a estrutura de entidades e a ferramenta MDA também. Desde que essa ferramenta produza classes parciais, você poderá estender o código gerado com bastante facilidade, sem precisar se preocupar que uma nova geração possa destruir seu código escrito pelo usuário.
Para encurtar esta longa história. Quando você usa o NHibernate, nada, repito nada , impede você de adotar um modelo de domínio rico. Eu recomendo usá-lo com FluentNHibernate e mapear manualmente. O código de mapeamento leva apenas 5 a 10 minutos para gravar. Suponho que o mesmo se aplica à estrutura da entidade e que suas ferramentas criem pelo menos classes parciais que são facilmente extensíveis.
Estou correto ao pensar dessa maneira, em outras palavras, com DDD toda a lógica de negócios no domínio e apenas usar o ORM para persistência através de repositórios?
Para a maior parte você está correto. Você deve ter um modelo de domínio avançado. Especialmente quando as coisas se tornam cada vez mais complexas, é mais fácil manter e estender quando você as desenhou corretamente. Mas lembre-se de que o DDD também conhece os Serviços (Camada de Domínio e Camada de Aplicativo) para implementar a lógica de negócios e Fábricas para encapsular a lógica criacional.
Eu também tendem a diferenciar lógica de negócios em lógica de domínio e lógica de negócios de aplicativo real. A lógica do domínio é como o domínio interage e se comporta enquanto a lógica do aplicativo, que é uma camada completamente diferente, encapsula como o domínio é usado para o caso de uso / aplicativo específico. Muitas vezes, tenho que atualizar o modelo de domínio para dar suporte a casos de uso específicos e torná-lo mais poderoso.