it-swarm.com.de

Service Layer vs DAO - Warum beides?

Ich habe mit SpringMVC, Hibernate und einigen Datenbanken in einem Java Webanwendungsbeispiel) gearbeitet.

Es gibt einige verschiedene, die dies tun, aber dieses Tutorial zur Integration von Spring 3 und Ruhezustand mit Beispiel enthält eine Modellklasse, eine Ansicht (in jsp) sowie eine Service- und eine Dao-Klasse für den Controller.

Meine Frage ist, machen nicht sowohl die Service- als auch die DAO-Klasse dasselbe? Warum brauchst du sie beide?

Dies war das Tutorial, das ich tatsächlich benutzte: http://fruzenshtein.com/spring-mvc-security-mysql-hibernate/

68
Jeff

Im Allgemeinen ist das DAO so leicht wie möglich und dient ausschließlich dazu, eine Verbindung zur Datenbank herzustellen. Manchmal wird es abstrahiert, damit verschiedene DB-Backends verwendet werden können.

Die Serviceschicht ist dazu da, Logik bereitzustellen, um die an und von dem DAO und dem Client gesendeten Daten zu verarbeiten. Sehr oft werden diese beiden Teile in demselben Modul und gelegentlich in demselben Code gebündelt, aber Sie werden sie immer noch als unterschiedliche logische Einheiten sehen.

Ein weiterer Grund ist die Sicherheit. Wenn Sie eine Serviceschicht bereitstellen, die keine Beziehung zur Datenbank hat, ist es schwieriger, vom Client aus Zugriff auf die Datenbank zu erhalten, außer über den Dienst. Wenn auf die Datenbank nicht direkt vom Client aus zugegriffen werden kann (und es gibt kein triviales DAO-Modul, das als Dienst fungiert), kann ein Angreifer, der den Client übernommen hat, nur versuchen, die Dienstschicht ebenfalls zu hacken, bevor er alle außer dem erhält am besten bereinigter Zugriff auf Ihre Daten.

61
gbjbaanb

Ich bin der Verfasser der fraglichen Post. Ich habe einen fairen Anteil daran, an verschiedenen Technologien und Architekturen zu arbeiten. Auf der Grundlage des oben Gesagten kann ich mit Sicherheit sagen, dass es immer eine gute Idee ist, eine Service- und eine Dao-Schicht zu haben. DAO sollte darauf beschränkt sein, nur Entitätsobjekte zur/von der Datenbank hinzuzufügen/zu aktualisieren/einzufügen/auszuwählen, und das ist alles. Wenn Sie logisch etwas mehr tun möchten, fügen Sie es der Serviceschicht hinzu. Dies hilft dabei, Code modular und einfach austauschbar zu machen, wenn die Datenbank ersetzt wird (für einen Teil der Daten). Dies gilt insbesondere für Anwendungen mit Berichten, die auch nach dem Abrufen von Daten aus der Datenbank eine hohe Logik aufweisen.

Auch im Frühjahr wird die Sicherheit idealerweise auf der Serviceschicht angewendet. Sie möchten diesen Weg nicht ändern.

42
lokesh

Adam Bien weist in seinem Buch darauf hin, dass der JPA EntityManager eine gute universelle Implementierung des DAO ist:

http://realworldpatterns.com/

In der Java EE-Welt muss fast nie ein eigenes DAO geschrieben werden, da JPA-Implementierungen eines enthalten. Sie müssen nur die Service-Schicht schreiben.

Das Implementieren einer eigenen DAO-Schicht ist wirklich ein Kater der sehr schlechten J2EE-Architektur von vor 15 Jahren, aber viele Menschen fühlen sich immer noch dazu gezwungen. Diese benutzerdefinierten DAO-Layer bieten häufig nur Weiterleitungsfunktionen, die die entsprechende Methode in EntityManager aufrufen.

Um Ihre Frage zu beantworten, benötigen Sie eine Serviceschicht und ein DAO, müssen jedoch nur die Serviceschicht schreiben.

12
Dean Schulze

Normalerweise füge ich den gesamten db-spezifischen Code (Abfragen) in DAOs und die Transaktionsabwicklung sowie die Geschäftslogik in Services ein. Auf diese Weise können Servicemethoden Methoden über mehrere Daos hinweg aufrufen und alles innerhalb derselben Transaktion behalten. Meiner Meinung nach ermöglicht dies eine bessere Wiederverwendung von Code über Daos hinweg.

4
sbrattla

Ich habe festgestellt, dass die Serviceschicht in den meisten Fällen unnötige Komplexität hinzufügt. Theoretisch ist es zu vermeiden, Unternehmenslogik in der Dao-Ebene zu haben, aber am Ende führt dies nur zu Verwirrung. Selbst einige Leute haben es nicht genutzt, die Dao-Ebene vollständig zu entfernen, da sie der Meinung sind, dass dies keinen Mehrwert bringt. http://ayende.com/blog/4784/architecting-in-the-pit-of-Doom-the-evils-of-the-repository-abstraction-layer

Aber wenn Sie mehrere Geschäftslogiken haben, dann ist dies eine gute Idee. Wie wichtig ist es, eine Service-Schicht zu erstellen?

2
Jesus