quindi sarebbe stato impossibile passare a un altro ORM (non che volevamo)).
Sembra sbagliato. Un grande vantaggio del modello di repository è che si nasconde la logica di accesso ai dati e che è facilmente scambiabile.
Finora mi sembra di inserire la mia logica aziendale nel mio modello di dominio e tramite i repository lavorerei con l'ORM (che io abbia mai scelto). Tuttavia, se volessi continuare a utilizzare lo strumento MDA per la parte ORM dell'applicazione, il modello creato qui sarebbe molto anemico (ovvero non contenere alcuna logica aziendale). Allo stesso modo se usassi Entity framework (.net) o NHibernate per il mio ORM, sarebbe anche un modello anemico. Non sono sicuro di dove inseriresti la logica aziendale se avessi appena usato NHibernate.
Un modello di dominio anemico è considerato una cattiva pratica da molti, ad esempio da Martin Fowler. Dovresti evitare un tale progetto perché un tale modello porta a tecniche di progettazione procedurale piuttosto che a un buon design orientato agli oggetti. Quindi hai classi di dati e classi di gestione / elaborazione, il che significa che hai separato stato e comportamento. Ma un oggetto dovrebbe davvero essere "stato e comportamento".
NHibernate fa un ottimo lavoro nell'ignoranza della persistenza. Puoi nascondere i dettagli della mappatura in XML o con FluentNHibernate e scrivere semplicemente POCO. È molto semplice creare un modello di dominio avanzato con NHibernate. Penso che tu possa farlo anche con il framework di entità e lo strumento MDA. Finché questo strumento produce classi parziali, puoi estendere il codice generato abbastanza facilmente senza doversi preoccupare che una nuova generazione possa distruggere il tuo codice scritto dall'utente.
Per farla breve. Quando usi NHibernate, niente, non ripeto nulla , ti impedisce di abbracciare un ricco modello di dominio. Consiglio di usarlo con FluentNHibernate e di mapparlo a mano. La scrittura del codice di mappatura richiede solo da 5 a 10 minuti. Suppongo che lo stesso valga per il framework delle entità e che i suoi strumenti almeno creino classi parziali facilmente estensibili.
Sono corretto nel pensare in questo modo, in altre parole con DDD tutta la logica aziendale nel dominio e usare l'ORM per la persistenza attraverso i repository?
Per la maggior parte hai ragione. Dovresti avere un modello di dominio avanzato. Soprattutto quando le cose diventano sempre più complesse, è più facile da mantenere ed estendere quando le hai progettate correttamente. Ma tieni presente che DDD conosce anche i servizi (Domain Layer e Application Layer) per implementare la logica aziendale e le fabbriche per incapsulare la logica creazionale.
Inoltre, tendo a differenziare la logica aziendale in logica di dominio e logica aziendale effettiva dell'applicazione. La logica del dominio è il modo in cui il dominio interagisce e si comporta mentre la logica dell'applicazione, che è un livello completamente diverso, incapsula il modo in cui il dominio viene utilizzato per il caso d'uso / l'applicazione specifici. Spesso devo aggiornare il modello di dominio per supportare casi d'uso specifici e renderlo più potente.