2010-01-22 14 views
5

Ich bin kürzlich in unserem Code über dieses Muster (?) Gelaufen und frage mich, ob es überhaupt nützlich ist. Wir haben eine Spring-App und ein Flex-Frontend mit BlazeDS. Es wurde beschlossen, dass wir Schnittstellen auf unserer DTOs verwenden, etwa so:DTOs und Schnittstellen

Java


public interface ISomeDTO { 
     Integer setId(); 
     void getId(Integer i); 
} 

public class SomeDTO implements ISomeDTO 
{ 
.. 
} 

 

Action


public interface ISomeDTO { 
     var id:Integer; 
} 

public class SomeDTO implements ISomeDTO 
{ 
.. 
} 

 

Was ist eine Schnittstelle auf einem DTO Sie gewinnen? Dies sind leichte Objekte mit absolut keiner Logik. DTOs sind sinnvoll, Schnittstellen machen Sinn, aber nicht zusammen.

Antwort

3

Ich sehe nicht, warum Schnittstellen und DTOs nicht zusammenarbeiten würden.

Betrachten Sie einen Factory/Assembler, der Domänenobjekte aus DTOs erstellt. Sie können die Factory mit Strategien konfigurieren, um spezifische Implementierungen eines Domänenobjekts basierend auf dem DTO-Typ zu erstellen. Der DTO würde hier idealerweise zu einer Schnittstelle typisiert. (Dies funktioniert auch in die entgegengesetzte Richtung).

Ich sage nicht, dass Sie jedes DTO hinter eine Schnittstelle stellen sollten, aber genauso wie bei Domänenobjekten wird es sicherlich Fälle geben, in denen dies von Vorteil ist.

+2

Sie tun in Ihrem Fall, und ich kann sehen, warum das von Vorteil wäre. Dies ist Standard in unserer Anwendung ohne ersichtlichen Grund (zumindest für mich). Mein Gedanke ist, eine Schnittstelle zu verwenden, wenn Sie sie brauchen, nicht nur weil. – unscene

3

In einer transaktionsbasierten Umgebung werden DTOs verwendet, um Ihre Datenbankelemente von der zugrunde liegenden db-Sitzung zu trennen.

Diese Sitzungen sind normalerweise nicht verfügbar, und die meisten Entitäten bestehen aus Proxies, die Mitgliedssammlungen lau- fend laden. Wenn Sie also auf eine Sammlungseigenschaft auf einer Proxy-Entität zugreifen wollten, lädt der Proxy die Sammlung zu diesem Zeitpunkt, unabhängig davon, ob eine Datenbanktransaktion existiert oder nicht. So kann ein Zugriff eines Entitätsmitglieds einen Fehler erzeugen, wenn keine aktive Transaktion vorliegt.

Genau dies passiert, wenn Sie Ihre Entitäten an die Ansicht weiterleiten, die versucht, auf ein Mitglied zuzugreifen. Da die Transaktionsverarbeitung normalerweise in der Service-Schicht definiert ist, gibt es in der View/Controller keine aktive Transaktion.

dieses Problem umschiffen gibt es verschiedene Ansätze:

  • Halten Sie die Session geöffnet durch z.B. obwohl streng ein Filtermechanismus (Spring OpenSessionInViewFilter), spricht dies ist ein Anti-Muster
  • lassen Sie Ihre DAOs ein Data Transfer Objects mit den benötigten Mitgliedern gefüllt Rückkehr bereits

Hoffnung, das half initialisiert.

+1

Sicher verstehe ich diese Punkte. Aber warum eine Schnittstelle auf einem DTO macht es für mich keinen Sinn? Die Verwendung von DTOs ist nicht unbekannt, nur die Aufnahme einer Schnittstelle hier. – unscene

+0

oh sry vollständig missverstanden die Fragen. spät und alles. ich verstehe nicht, warum man hier auch eine Schnittstelle benutzen würde, ergibt für mich keinen Sinn:/ – fasseg

+0

Zumindest bin ich nicht der Einzige: P Vielen Dank für diese Antwort. Gut gemacht. – unscene