Ich entwerfe große Anwendungen (neu). Wir verwenden eine mehrschichtige Architektur, die auf DDD basiert.
Wir haben MVC mit Datenschicht (Implementierung von Repositorys), Domänenschicht (Definition des Domänenmodells und der Schnittstellen - Repositorys, Dienste, Arbeitseinheit), Dienstschicht (Implementierung von Diensten). Bisher verwenden wir Domänenmodelle (meistens Entitäten) für alle Ebenen und DTOs nur als Ansichtsmodelle (im Controller gibt der Dienst Domänenmodelle zurück, und der Controller erstellt ein Ansichtsmodell, das an die Ansicht übergeben wird).
Ich habe unzählige Artikel über das Verwenden, Nicht-Verwenden, Zuordnen und Übergeben von DTOs gelesen. Ich verstehe, dass es keine endgültige Antwort gibt, bin mir aber nicht sicher, ob es in Ordnung ist oder nicht, Domänenmodelle von Diensten an Controller zurückzugeben. Wenn ich ein Domänenmodell zurückgebe, wird es immer noch nie an die Ansicht übergeben, da der Controller immer ein ansichtsspezifisches Ansichtsmodell erstellt - in diesem Fall scheint es legitim zu sein. Andererseits fühlt es sich nicht richtig an, wenn das Domänenmodell die Geschäftsschicht (Serviceschicht) verlässt. Manchmal muss der Dienst ein Datenobjekt zurückgeben, das nicht in der Domäne definiert wurde, und dann müssen wir entweder der Domäne, die nicht zugeordnet ist, ein neues Objekt hinzufügen oder ein POCO-Objekt erstellen (dies ist hässlich, da einige Dienste Domänenmodelle zurückgeben, andere DTOs effektiv zurückgeben).
Die Frage ist: Wenn wir ausschließlich Ansichtsmodelle verwenden, ist es in Ordnung, Domänenmodelle bis hin zu Controllern zurückzugeben, oder sollten wir immer DTOs für die Kommunikation mit der Serviceschicht verwenden? Wenn ja, ist es in Ordnung, Domänenmodelle basierend auf den Anforderungen der Dienste anzupassen? (Ehrlich gesagt glaube ich nicht, da Services die Domain verbrauchen sollten.) Wenn wir uns strikt an DTOs halten sollten, sollten sie in der Service-Schicht definiert werden? (Ich denke schon.) Manchmal ist es klar, dass wir DTOs verwenden sollten (z. B. wenn der Dienst viel Geschäftslogik ausführt und neue Objekte erstellt), manchmal ist es klar, dass wir nur Domänenmodelle verwenden sollten (z. B. wenn der Mitgliedschaftsdienst einen anämischen Benutzer zurückgibt ( s) - es scheint nicht sehr sinnvoll zu sein, ein DTO zu erstellen, das dem Domänenmodell entspricht) - aber ich bevorzuge Konsistenz und bewährte Verfahren.
Article Domain vs DTO vs ViewModel - Wie und wann werden sie verwendet? (und auch einige andere Artikel) ist meinem Problem sehr ähnlich, beantwortet aber diese Frage (n) nicht. Artikel Soll ich DTOs im Repository-Muster mit EF implementieren? ist auch ähnlich, aber es geht nicht um DDD.
Haftungsausschluss: Ich beabsichtige nicht, ein Entwurfsmuster nur zu verwenden, weil es existiert und ausgefallen ist. Andererseits möchte ich gute Entwurfsmuster und -praktiken verwenden, auch weil es beim Entwerfen der Anwendung als Ganzes und beim Trennen hilft Selbst im Moment ist es nicht "notwendig", ein bestimmtes Muster zu verwenden.
Wie immer danke.