Frage

Gibt es eine wirklich praktische Art und Weise DTOs zu vermeiden, verwenden, wenn Daten durch Hibernate-backed Transaktions Service-Methoden vorbei? Mit anderen Worten sind DTOs die einzige nicht-hacky Lösung faul Initialisierung Probleme zu vermeiden?

Ich denke, die zwei beliebten Alternativen zu DTOs und die Gründe, warum ich weiß nicht wirklich wie sie sind:

  1. Open Session im Ansichtsmuster. Dies Ich mag es nicht, wie ich wirklich Transaktions die Service-Methoden behalten möchte (das heißt die Hibernate-Sitzung begangen und geschlossen, wenn das Verfahren beendet). Dies ist vor allem, weil ich nicht über Transaktionen zu kümmern haben möchte, wenn ich zum Beispiel muß später auf den Dienst als Web-Service veröffentlichen.

  2. Passing Domain / Business-Objekte durch Service-Methoden statt DTOs und eifrig das Abrufen der benötigten Attribute / Eigenschaften. Dies ist etwas besser. Allerdings in einer nicht-trivialen Domäne Objekthierarchie mit komplizierter Einheit Beziehungen der eifrige fetching hat irgendwo zu stoppen. Und wenn es das tut, kann ich nicht sehen, wie das wäre nicht sehr schnell zu einem kompletten hackaton dreht Einheiten ersetzt mit ids alle über den Ort verweisen.

Bin ich etwas fehlt oder sind DTOs in der Tat die einzige solide Ansatz aus Wartbarkeit Sicht?

War es hilfreich?

Lösung

Die einzige Möglichkeit, Einheiten, um wirklich zu Ende Endanwendung ist etwas ein wenig anspruchsvoller als OpenSessionInView zu verwenden. Nach meiner Erfahrung wirst du die Hibernate-Sitzung manuell auf der Anwendungsebene haben, zu verwalten. OpenSessionInView gibt Ihnen nur die gleiche Sitzung für eine Anfrage. Danach werden Sie ständig auf die aktuelle Sitzung wieder angebracht werden müssen. Werfen Sie einen Blick auf Seam und Gespräche oder eigenes Hibernate Session-Management implementieren. Wir derzeit manuell unsere Sitzungen verwalten basierend auf, wenn ein Assistent beginnt und endet und verwenden Frühling AOP-Sitzungen an den richtigen Fäden gerade rechtzeitig zu befestigen (Sessions sind nicht Thread sicher, nicht eine gute Mischung mit AJAX)

WebServices auf der anderen Seite ganz sicher gehen, irgendeine Form von DTO zu müssen. Ich sehe keinen Weg dran vorbei. Einheiten können wie POJOs aussehen, aber nicht wirklich, serialisiert sie von schwer zu fast unmöglich reichen kann. Erstellen Sie einfach DTOs, die mit dem Ziel der Service-Methode passen und mit ihm getan werden.

Ich persönlich glaube nicht das DTO Muster schrecklich, wenn Sie nur eine Website zu machen ist es machbar Ende zu gehen mit Einheiten zu beenden und es kann Ihnen sogar einige Performance kaufen, aber wenn Sie eine flexiblere Architektur möchten , Stick mit DTOs.

Andere Tipps

Repositorys, Dienste und Controller sollten die Orte, die sich mit der Anwendung Kern (Hibernate Session sicherlich als die Gesamtheit Ihrer Repository-Schicht verwendet werden können, wenn Sie mögen) sein.

Ansichten sollen nicht mit Ihrer Anwendung Kern zu tun hat, das Domänenmodell. Sie sollten nicht mit den lebenden Objekten zu tun hat, sondern mit einer nicht-live zugeschnittene Darstellung der Live-Objekte. Ansichten sollen nur die Daten übergeben werden, die sie benötigen, im speziellen Format sie es brauchen. Sie sollten DTOs für Ihre Ansichten bauen. Dieses Muster ist auch als Ansicht Modell bekannt, mit Domain Model zu kontrastieren.

Ihr Leben einfacher zu machen, kann es Bibliotheken oder Frameworks sein, die können auto-Karte von Ihrem Domain-Modell zu Ihren Ansicht Modellobjekten Objekte und zurück. In .NET gibt es einen Open-Source-Framework AutoMapper derzeit in der Entwicklung genannt; Ich bin mir nicht sicher, was es für Java ist.

Wenn Sie Ihre Anforderung entspannen, die Sitzung zu schließen, können Sie immer noch offene Sitzung in Sicht verwenden und einfach alles, was in Ihren Service-Transaktionen begehen. Die Sitzung wird weiterhin zur Verfügung zu faul holen, aber alle Transaktionen abgeschlossen sein. Aber wenn Sie einen Web-Service wechseln gehen, dann würden Sie auf jeden Fall alle Ihre Einheiten zu eifrig Last benötigen. DTOs zwingen Sie gerade eifrig Last bewusst und zufällige Faulheit zu verhindern.

Also, unterm Strich, wenn Sie vorsichtig sind, können Sie die DTOs in beiden Umgebungen überspringen, aber ich würde wahrscheinlich mit offener Sitzung im Blick bleibt und über Web-Service kümmern, wenn sie tatsächlich eine Anforderung werden.

Ich liebe die Idee von DTOs, aber ich habe immer das Gefühl, dass sie von anderen Entwicklern seit Umsetzung dieses Ansatzes richtig die ganzen Weg hinunter in die Datenbank nicht sehr gut akzeptiert oder gemocht wurden erfordern in der Regel sehr viel Mühe. Aus diesem Grund Ich habe Blaze-Persistence Entity Ansichten denen können Sie Modell DTOs als Schnittstellen, die auf effiziente Weise an die JPA Entity-Modell abzubilden. Sie können ein Unternehmen im Hinblick auf eine Abfrage anwenden und die Abfrage wird in einer Art und Weise angepasst werden, dass sie nur den tatsächlich erforderlichen Zustand zu holen, anstatt all Staaten und Karte, das in Java.

Mit dem Entity Ansicht verwenden Sie brauchen nicht auf die offene Sitzung im Hinblick auf anti-Muster, da die gewünschte Struktur mit Spannung geladen wird. Da gibt es auch keine Einheit beteiligten Objekte, gibt es keine faulen Laden Themen sein.

Da oft das Entity-Modell mit dem DTO Modell in frühen Entwicklungsstadien so ähnlich ist, sehe ich oft Entwickler überspringen nur ein separates DTO-Modell zu schaffen, wie sie versuchen, den Streit zu vermeiden. Sobald Querschnittsthemen wie Wirtschaftsprüfung, Land Statistiken oder denormalizations in dem Entity-Modell oder die Menge an Daten, die in dem Entity-Modell als viel größer wachsen, was Sie brauchen eigentlich für Anwendungsfälle des Unternehmens, führen Entwickler Probleme.

Sie werden sicher wie ein Blog Post in dieser Angelegenheit ich vor einiger Zeit geschrieben haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top