Capa de servicio vs DAO - ¿Por qué ambos?

64

He estado trabajando con SpringMVC, Hibernate y algunas bases de datos en un ejemplo de aplicación web java.

Hay algunos diferentes que hacen esto, pero este tutorial de integración de Spring 3 e hibernación, por ejemplo, tiene una clase de modelo, vista (en jsp) y un servicio y clases de dao para el controlador.

Mi pregunta es, ¿tanto el servicio como las clases DAO hacen lo mismo? ¿Por qué los necesitarías a ambos?

Este fue el tutorial que estaba usando: http://fruzenshtein.com/spring-mvc-security-mysql-hibernate/

Jeff
fuente

Respuestas:

60

En general, el DAO es lo más ligero posible y existe únicamente para proporcionar una conexión a la base de datos, a veces abstraída para que se puedan utilizar diferentes backends de la base de datos.

La capa de servicio está ahí para proporcionar lógica para operar en los datos enviados hacia y desde el DAO y el cliente. Muy a menudo, estas 2 piezas se agruparán en el mismo módulo y, ocasionalmente, en el mismo código, pero aún las verá como entidades lógicas distintas.

Otra razón es la seguridad: si proporciona una capa de servicio que no tiene relación con la base de datos, entonces es más difícil obtener acceso a la base de datos desde el cliente, excepto a través del servicio. Si no se puede acceder a la base de datos directamente desde el cliente (y no hay un módulo DAO trivial que actúe como servicio), entonces todo lo que un atacante que se ha hecho cargo del cliente puede hacer es intentar hackear la capa de servicio también antes de que obtenga todo menos el Acceso más higienizado a sus datos.

gbjbaanb
fuente
1
Estoy de acuerdo con la separación de las capas de servicio y dao y su capa de servicio que contiene su lógica empresarial.
Peter Delaney
sin mencionar que 1 servicio puede llamar a varios DAO, por ejemplo, al salvar a un usuario, puede hablar con el usuario o el usuario o con el usuario, etc. ¿O deberíamos crear un servicio para cada uno? ¿Y quién podría llamar a todos estos servicios?
Fermín Silva
40

Soy el escritor del post en cuestión. Tengo mi parte justa de trabajar en diferentes tecnologías y arquitecturas diferentes. Basado en lo anterior, puedo decir con seguridad que tener una capa de servicio y una capa de dao siempre es una buena idea. DAO debe limitarse a solo agregar / actualizar / insertar / seleccionar objetos de entidad en / desde la base de datos y eso es todo. Si desea hacer algo adicional en términos de lógica, agréguelo a la capa de servicio. Esto ayudará a hacer que el código sea modular y fácilmente reemplazable cuando se reemplaza la base de datos (para alguna parte de los datos). Esto es especialmente aplicable en aplicaciones que involucran informes que tienen lógicas pesadas incluso después de obtener datos de la base de datos.

Además, en primavera, la seguridad se aplica idealmente en la capa de servicio. No te gustaría cambiar de esta manera.

lokesh
fuente
55
Hola, muchas gracias por responder a mi pregunta; ¡eso es dedicación a tu blog! Gracias por el gran ejemplo, sigue escribiendo.
Jeff
Esto me estaba molestando por algún tiempo y creo que la experiencia es la que más ayuda en estas situaciones. Gracias.
Utku Özdemir
Estoy de acuerdo con la separación de las capas de servicio y dao y su capa de servicio que contiene su lógica comercial y solo llamaría métodos Dao. ¿Qué pasa cuando uno de mis métodos de servicio necesita llamar a otro método de servicio? ¿Debería tener otra abstracción sobre la capa de servicio que llame a varios métodos de servicio?
Peter Delaney
No. Las clases en la capa de servicio pueden tener referencias entre sí (según sea necesario) y pueden llamar a los métodos requeridos.
lokesh
11

Adam Bien señala en su libro que JPA EntityManager es una buena implementación universal del DAO:

http://realworldpatterns.com/

En el mundo de Java EE casi nunca es necesario escribir su propio DAO porque las implementaciones de JPA incluyen uno. Solo tiene que escribir la capa de servicio.

La implementación de su propia capa DAO es realmente una resaca de la arquitectura J2EE muy pobre de hace 15 años, pero muchas personas todavía se sienten obligadas a hacerlo. Estas capas DAO personalizadas a menudo proporcionan nada más que funciones de reenvío que llaman al método correspondiente en EntityManager.

Entonces, para responder a su pregunta, sí, necesita una capa de servicio y un DAO, pero solo tiene que escribir la capa de servicio.

Dean Schulze
fuente
2
No estoy seguro de si eso se aplica a Spring: siempre hay un DAO personalizado que debe hacerse para el Modelo. ¿Quizás su afirmación "casi nunca es necesario escribir su propio DAO" se aplica específicamente a contenedores EJB / servidor de aplicaciones?
Don Cheadle
1
Es mejor escribir el suyo (DAO / DAOImpl), aunque solo se asignará a EntityManager: eso es porque en el futuro puede agregar otra implementación de DAO sin necesidad de cambiar el código de la capa de servicio .
ahmednabil88
@YajliMaclo ¿cuál es la diferencia qué cambiar?
Alex78191
4

Normalmente pongo todos los códigos específicos de db (consultas) en los DAO y el manejo de transacciones y la lógica empresarial en los servicios. Esto permite que los métodos de servicio invoquen métodos en múltiples dao y lo mantengan todo dentro de la misma transacción. En mi opinión, esto permite una mejor reutilización del código en Dao.

sbrattla
fuente
2

He descubierto que la capa de servicio agrega complejidad innecesaria en la mayoría de los casos. En teoría es evitar tener lógica de negocios en la capa de dao, pero al final esto solo lleva a la confusión, incluso algunas personas no han utilizado para eliminar completamente la capa de dao, ya que sienten que no agrega valor. http://ayende.com/blog/4784/architecting-in-the-pit-of-doom-the-evils-of-the-repository-abstraction-layer

Pero si tiene múltiples lógicas comerciales, entonces sí. Es una buena idea. ¿Qué tan esencial es hacer una capa de servicio?

Jesús
fuente
3
He leído la publicación del blog de Ayende varias veces, y no puedo evitar la sensación de que su diseño (con el que habría estado de acuerdo en un momento), aunque era fiel al espíritu de YAGNI, casi inevitablemente costaría más tiempo de desarrollo incluso en el a medio plazo de lo que costaría establecer la abstracción de capas en primer lugar. Me pregunto si ha cambiado su opinión sobre el acoplamiento estrecho entre toda la aplicación y NHibernate ahora que es aún más común que una sola aplicación consulte múltiples fuentes de datos SQL, NoSQL y API.
Sr. Cochese
@LennyGodber sí, sé que sientes que IMO es mejor tener la capa DAO / repositorio porque tiene más ventajas que desventajas porque, como dijiste, es muy común tener múltiples fuentes de datos
Jesús
-1

En mi humilde opinión, la capa de servicio se puede considerar como una capa entre el controlador y la capa DAO. Esta capa de servicio es exactamente donde podemos agregar lógica empresarial e incluso crear un objeto de retorno específico para lo que la vista debe representar.

compserve23
fuente