Es wäre also unmöglich gewesen, zu einem anderen ORM zu wechseln (nicht das, was wir wollten).
Das scheint falsch. Ein Hauptvorteil des Repository-Musters besteht darin, dass Sie die Datenzugriffslogik ausblenden und sie leicht austauschbar ist.
Bisher fühlt es sich so an, als würde ich meine Geschäftslogik in mein Domain-Modell einfügen und über Repositories mit dem ORM arbeiten (was auch immer ich gewählt habe). Wenn ich jedoch weiterhin das MDA-Tool für den ORM-Teil der Anwendung verwenden möchte, wäre das hier erstellte Modell sehr anämisch (dh es enthält keine Geschäftslogik). In ähnlicher Weise wäre es auch ein anämisches Modell, wenn ich Entity Framework (.net) oder NHibernate für mein ORM verwenden würde. Ich bin mir nicht sicher, wo Sie die Geschäftslogik platzieren würden, wenn ich nur NHibernate verwenden würde.
Ein anämisches Domänenmodell wird von vielen als schlechte Praxis angesehen, beispielsweise von Martin Fowler. Sie sollten ein solches Design vermeiden, da ein solches Modell eher zu prozeduralen Designtechniken als zu einem guten objektorientierten Design führt. Sie haben dann Datenklassen und Manager- / Verarbeitungsklassen, was bedeutet, dass Sie Status und Verhalten getrennt haben. Aber ein Objekt sollte wirklich "Zustand und Verhalten" sein.
NHibernate leistet hervorragende Arbeit bei der Unwissenheit über Beharrlichkeit. Sie können die Zuordnungsdetails in XML oder mit FluentNHibernate ausblenden und einfach einfache POCOs schreiben. Mit NHibernate ist es sehr einfach, ein umfangreiches Domain-Modell zu erstellen. Ich denke, Sie können dies auch mit dem Entity Framework und dem MDA-Tool tun. Solange dieses Tool Teilklassen erzeugt, können Sie den generierten Code ziemlich einfach erweitern, ohne befürchten zu müssen, dass eine neue Generation Ihren vom Benutzer geschriebenen Code zerstören könnte.
Um diese lange Geschichte kurz zu machen. Wenn Sie NHibernate verwenden, hindert Sie nichts, ich wiederhole nichts daran , ein reichhaltiges Domain-Modell anzunehmen . Ich empfehle die Verwendung mit FluentNHibernate und die Zuordnung von Hand. Das Schreiben des Mapping-Codes dauert nur 5 bis 10 Minuten. Ich nehme an, dass das Gleiche für das Entity-Framework gilt und dass seine Tools zumindest Teilklassen erstellen, die leicht erweiterbar sind.
Bin ich richtig, wenn ich so denke, mit anderen Worten, mit DDD die gesamte Geschäftslogik in der Domäne und verwende das ORM nur für die Persistenz über Repositorys?
Zum größten Teil sind Sie richtig. Sie sollten ein reichhaltiges Domain-Modell haben. Besonders wenn die Dinge immer komplexer werden, ist es einfacher, sie zu warten und zu erweitern, wenn Sie sie richtig entworfen haben. Beachten Sie jedoch, dass DDD auch die Dienste (Domänenschicht und Anwendungsschicht) zur Implementierung von Geschäftslogik und Fabriken zur Kapselung der Erstellungslogik kennt.
Ich neige auch dazu, Geschäftslogik in Domänenlogik und tatsächliche Anwendungsgeschäftslogik zu unterscheiden. Die Domänenlogik gibt an, wie die Domäne interagiert und sich verhält, während die Anwendungslogik, bei der es sich um eine völlig andere Schicht handelt, die Verwendung der Domäne für den jeweiligen Anwendungsfall / die jeweilige Anwendung kapselt. Oft muss ich das Domänenmodell aktualisieren, um bestimmte Anwendungsfälle zu unterstützen und es leistungsfähiger zu machen.