2015-07-25 10 views
5

Ich entwickle eine Web-Anwendung mit einer geschichteten Architektur. Ich habe:Ist es eine schlechte Übung, Entitätsobjekte für alle Ebenen einer Webanwendung zu verwenden?

  1. Application Layer (Controller)
  2. Service Layer (Services)
  3. Data Access Layer (DAOs)

, die mit einem Back-End-Oracle-Datenbank verbindet.

Ich verwende JPA mit Hibernate als die Implementierung. Ich erstelle daher Entitäten, um die Objektansicht meiner relationalen Datenbanktabellen zu modellieren.

Meine Frage ist ... Wird es als schlechte Praxis angesehen, diese Objekte Objekte über alle 3 meiner Schichten zu verwenden?

Ich weiß, es muss mindestens von Data Access Layer verwendet werden, aber was ist darüber hinaus in den Service & Application Layers?

Ich habe gesehen, einige Leute verwenden DTOs in den Dienst & Anwendungsschichten statt, und sie tun Konvertierung zwischen DTOs und Entitäten zwischen den Service-Datenzugriffsschichten &.

Frage mich nur, was ist die beste Praxis für diese und was sollte der beste Ansatz sein?

+1

Der geeignete Bereich/Lebensdauer einer Entität hängt oft von der Lebensdauer/Reichweite ihres Entity Managers ab.Sie können außerhalb des Managerbereichs veraltet sein, aber sie werden zu früh verworfen, und Sie können den Cache der ersten Ebene des Managers nicht effektiv nutzen. Es gibt keinen einheitlichen Ansatz. Was Sie tun sollten, hängt von der Wahl der Plattform, der Integration von JPA und den Anforderungen ab. – McDowell

Antwort

2

Sie sollten Ihre Entitätsobjekte niemals in allen Ebenen verwenden. Indem Sie dasselbe Objekt in allen Ebenen verwenden, können Sie die enge Verbindung zwischen Ihren UI-Formulardaten und Datenbanktabellen herstellen.

Wenn Sie den Feldnamen auf der Benutzeroberfläche ändern möchten, müssen Sie die entsprechende Spalte in Ihrer Tabelle ändern. Daher wird DTOs, VOs empfohlen, die Daten von DAO zu Ihrem Frontend zu übertragen. Verwenden Sie verschiedene Kartentypen, die auf dem Markt verfügbar sind. Eines der Beispiele ist orika mapper.

+0

Was ist die Alternative, erstellen Sie ein neues Datenmodell für jede Schicht? Das wäre extrem albern. – bhspencer

+0

Nicht für jede Schicht. Trennen Sie zumindest Ihre Entitätsobjekte und Objekte, die Ihre Daten von/zur UI transportieren. –

4

Es gibt Fälle, in denen Datenobjekte exakt mit den Objekten übereinstimmen, die der Benutzer auf dem Bildschirm bearbeitet. Auf der anderen Seite gibt es Fälle, in denen der Benutzer an Objekten arbeitet, die gemäß einer Geschäftslogik abgeleitet und/oder mehrere davon betreffen. Viele Berichtsanwendungen sind Beispiele für letzteres.

Abhängig von Ihrer Domäne und Ihrem Benutzerprofil ist die Häufigkeit der Übereinstimmung von Daten/UI-Objekten hoch oder niedrig. Sie sollten bei Bedarf separate Modelle definieren und die Kosten für die Wartung durch Änderungen in Ihrem Projekt übernehmen. Daher sind übermäßig getrennte Modelle eine schlechte Praxis. Wenn Sie andererseits darauf bestehen, Datenmodelle überall hin zu geben, ist Ihre Geschäftslogik oder Ihr UI-Code möglicherweise nicht sehr sauber.

Die Entscheidung, ob Datenzugriffsschichtobjekte und solche, die an die Benutzerschnittstelle übergeben werden, zu trennen, hängt auch von den Tools ab, die Sie verwenden. In Fällen, in denen Controller zum Beispiel in JSON auf eine statische Art und Weise serialisiert werden (*), könnte man Klassen für jede unterschiedliche Baumdurchquerung (zu verwenden) des Objektgraphen definieren. Auf der anderen Seite können dieselben Objekte mit einer JSP-basierten Benutzeroberfläche verwendet werden.

(*) Ein Beispiel ist Jackson, das Anmerkungen verwendet, die die Art und Weise, wie das Objekt (Graph) in einen Baum serialisiert wird, verwenden. Es gibt Mittel, um den Baum zu begrenzen - nützlich zum Verhindern unerwünschter Datenlecks - jedoch ist ihre Praktikabilität und Wartbarkeit in Fällen, auf die ich stieß, begrenzt.

Verwandte Themen