2010-09-10 7 views
22

ich am Beispiel sah http://solitarygeek.com/java/developing-a-simple-java-application-with-spring/comment-page-1#comment-1639Warum Service-Layer verwenden?

Ich versuche, im Beispiel in erster Linie, um herauszufinden, warum benötigt wird, der Service-Layer er zur Verfügung stellt. Wenn Sie nahm es heraus, dann in Ihrem Client, könnten Sie einfach tun:

UserDao userDao = new UserDaoImpl(); 
Iterator users = userDao.getUsers(); 
while (…) { 
… 
} 

Es ist wie der Service-Schicht scheint einfach ein Wrapper um die DAO. Kann mir jemand einen Fall geben, in dem die Dinge unordentlich werden könnten, wenn die Service-Schicht entfernt würde? Ich sehe einfach keinen Sinn darin, mit der Service-Schicht zu beginnen.

Antwort

21

Die Service-Schicht ist ein Wrapper um das DAO herum, ein übliches Anti-Pattern. In dem Beispiel, das Sie geben, ist es sicherlich nicht sehr nützlich. Mit Hilfe einer Service-Schicht bedeutet, dass Sie mehrere Vorteile erhalten:

  • Sie erhalten eine klare Unterscheidung zwischen Aktivität Web-Typ am besten in der Steuerung und allgemeine Geschäftslogik getan zu machen, die nicht webbezogenen ist. Sie können die dienstbezogene Geschäftslogik getrennt von der Steuerungslogik testen.

  • Sie können Transaktionsverhalten angeben. Wenn Sie also Aufrufe an mehrere Datenzugriffsobjekte haben, können Sie angeben, dass sie innerhalb derselben Transaktion stattfinden. In Ihrem Beispiel gibt es einen ersten Aufruf an einen Dao, gefolgt von einer Schleife, die vermutlich mehr Dao-Aufrufe enthalten könnte. Wenn diese Anrufe innerhalb einer Transaktion gehalten werden, arbeitet die Datenbank weniger (sie muss nicht für jeden Anruf bei einem Dao eine neue Transaktion erstellen), aber was noch wichtiger ist, bedeutet, dass die abgerufenen Daten konsistenter werden.

  • Sie können Services verschachteln, so dass, wenn Sie ein anderes Transaktionsverhalten haben (erfordert eine eigene Transaktion), können Sie dies erzwingen.

  • Sie können den PostCommit-Interceptor verwenden, um Benachrichtigungen wie das Versenden von E-Mails zu senden, so dass der Controller nicht verschwendet wird.

Typischerweise Dienste I habe, die Anwendungsfälle für eine einzige Art von Benutzer, wobei jede Methode auf dem Dienst umfasst eine einzige Aktion (Arbeit in einem einzigen Anfrage-Antwort-Zyklus durchgeführt werden), dass der Benutzer durchführen würde Im Gegensatz zu Ihrem Beispiel gibt es normalerweise mehr als einen einfachen Datenzugriffsobjekt-Aufruf, der dort ausgeführt wird.

+3

„Im Beispiel Sie geben es ist sicher nicht sinnvoll“, nicht sinnvoll heute. Es wird morgen sein, wenn Sie anfangen, weitere Funktionen hinzuzufügen, und Logik und Regeln benötigen (die sich möglicherweise von einem Kunden/einer Installation/etc. Zu einer anderen unterscheiden müssen) - Logik, die nicht in der Datenzugriffsebene platziert werden sollte. – nos

+0

@nos: vereinbart. Während ich zögere, den Leuten zu raten, etwas einzubauen, nur weil sie es in Zukunft vielleicht nicht brauchen, ist es zu einfach, wie eine Anwendung wächst, neue Bits in einen Controller oder Dao zu stopfen, weil es bequem ist. –

13

Werfen Sie einen Blick auf die folgenden Artikel:

http://www.martinfowler.com/bliki/AnemicDomainModel.html

Es hängt alles davon ab, wo Sie möchten, dass Ihre Logik setzen - in Ihre Dienstleistungen oder Ihre Domain-Objekte.

Der Service-Layer-Ansatz ist geeignet, wenn Sie eine komplexe Architektur haben und unterschiedliche Schnittstellen zu Ihren DAOs und Daten benötigen. Es ist auch gut, kursive Methoden für Clients bereitzustellen, die an mehrere DAO's anrufen, um Daten zu erhalten.

In den meisten Fällen möchten Sie jedoch eine einfache Architektur, also überspringen Sie die Service-Schicht und betrachten Sie einen Domänenmodell-Ansatz. Domain Driven Design von Eric Evans und der InfoQ Artikel hier erweitert auf diesem:

http://www.infoq.com/articles/ddd-in-practice

13

Mit Service-Layer ist ein allgemein anerkannter Design-Muster in der Java-Community.Ja, Sie könnten sofort die Dao-Implementierung verwenden, aber was, wenn Sie einige Geschäftsregeln anwenden möchten.

Angenommen, Sie möchten einige Überprüfungen durchführen, bevor Sie einem Benutzer erlauben, sich am System anzumelden. Wo würdest du diese Logiken hinstellen? Außerdem ist die Service-Schicht der Ort für die Transaktionsabgrenzung.

Es ist generell gut, Ihre Dao-Schicht sauber und mager zu halten. Ich schlage vor, Sie lesen den Artikel “Don’t repeat the DAO”. Wenn Sie die Prinzipien in diesem Artikel befolgen, werden Sie keine Implementierung für Ihre Daos schreiben.

Bitte beachten Sie auch, dass der Umfang dieses Blogbeitrags Anfängern im Frühling helfen sollte. Der Frühling ist so mächtig, dass man es sich verbiegen kann Ihre Bedürfnisse mit leistungsfähigen Konzepten wie AOP usw.

Grüße passen, James