2011-11-14 22 views
7

Estoy confundido acerca de la estructura de crear servicio capa y DAO capa: en algunos ejemplos veo a algunas personas la creación de interfaz + implementación tanto para el servicio y la DAO y en otros ejemplos veo a gente crear aplicación única especialmente cuando los DAOs extiende una clase AbstractDao que contiene métodos genéricos para aquellos DAOs, así que estoy confundido acerca de lo que debe ir, por qué gramo o para esta solución u otra, y cuál es la mejor práctica (comúnmente utilizada), por favor avise.Creación capa de servicio y la capa DAO (interfaz + implementació) o implementació única

Respuesta

6

Sugiero crear interfaces para el servicio y para DAO. Muy a menudo le gustaría burlarse del servicio en pruebas unitarias de código, que utilizan este servicio. También Spring, por ejemplo, le obliga a usar interfaces cuando usa algunos proxies de Spring, por ejemplo, para transacciones. Entonces deberías tener una interfaz para el servicio.

DAO es más parte interna, pero siempre trato de usar interfaces para simplificar las pruebas.

+0

por favor pueden dar más detalles más con ejemplos y referencias, porque necesito conveniencia algún colega. –

2

prefiero interfaz + implementaciones por las siguientes razones:

  • Interfaces convierte contratos: te dicen lo que está disponible para llamar, y usted no tendrá que preocuparse acerca de la aplicación de los mismos, con la condición de que se espera que el resultado .
  • Puede crear la implementación personalizable de la interfaz sin rompiendo otras implementaciones de la misma interfaz (generalmente útil al escribir la prueba de la unidad). Personalizar una única clase implementada puede traer más errores de los que no notará fácilmente.
  • Crea un marco que se puede documentar.

Las subclases implementadas se utilizan para crear la lógica de negocio/aplicación que se ajusta al contrato de interfaz.

+0

¿Qué pasa si los DAO extienden un BasicDao que contiene métodos genéricos para operaciones CRUD, entonces la interfaz será importante, ya que puedo anular los métodos genéricos en el BasicDao? –

+0

Puede anular el método, pero la firma del método será la misma. Esencialmente, el usuario no sabrá que el método está subclasificado, pero solo está interesado en los datos devueltos por el Servicio/DAO. –

+0

así que si se usa una clase genérica de AbstractDao con los DAO, también es mejor usar la interfaz. –

0

La implementación de interfaz + se utiliza para tener un acoplamiento flojo. Usted tiene la flexibilidad de cambiar o cambiar implementaciones fácilmente sin grandes cambios en el código.

Imagine un escenario en el que utiliza Hibernate para la persistencia (Capa DAO) y necesita cambiar a JPA o iBatis o cualquier otro ORM para ese asunto.

Si está utilizando interfaces, puede simplemente escribir una implementación específica para JPA y "enchufarla" en lugar de Hibernate. El código de servicio sigue siendo el mismo.

+0

¿Qué pasa si estoy usando un AbstractDao que contiene métodos genéricos para operaciones CRUD y todos los DAO extienden ese AbstractDao supongo que sería suficiente que usar interfaz con daos, o tendré que extender el BasicDao e implementar la interfaz ambos? –

1

Solo he hecho las implementaciones de la capa de servicio, no me molesté con las interfaces (excepto donde tenía que hacerlo). Probablemente debería escribir las interfaces, pero no hay problemas hasta el momento. Estoy haciendo una prueba unitaria muy bien sin burlarme de la capa de servicio.

Además, no tengo una capa DAO, ya que estoy usando hibernate y me pareció excesivo. Gran parte de mi razonamiento se basa en este blog, eloquently written by Bozho.

Creo que es quite debatable (si desea tener DAO e hibernar), sin embargo estoy muy contento con mi decisión, paso objetos de dominio grueso y luego simplemente hago una llamada a la sesión de hibernación. Cada método en la capa dao sería, literalmente, solo una línea (session.persist (mObject), o similar).

Un argumento que escuché en contra de esto fue que una capa dao facilitaría el cambio/eliminación de orm en una fecha posterior. No estoy seguro si el tiempo dedicado a codificar la capa dao en primer lugar agregado al tiempo de codificación del cambio, sería menos que codificar el cambio sin la capa dao por sí mismo. Nunca tuve que cambiar la tecnología ORM donde trabajé, por lo que es un pequeño riesgo.

+0

para que use los métodos de hibernación dentro de la capa de servicio directamente? –

+1

Haría lo mismo. Comience con la implementación e introduzca la interfaz cuando surja más de una implementación. Sin embargo, si el servicio debe ser visible para muchos clientes al principio, entonces la introducción de la interfaz parece ser razonable. –

+0

@fresh_dev yep, editará la respuesta con un par de referencias – NimChimpsky

0

Otro argumento para interfaz de aplicación + modelo es que los proxies para las interfaces son compatibles con Java en sí, mientras que la creación de proxies para las implementaciones requiere el uso de la biblioteca como cglib. Y esta proxies son necesarios para el soporte de transacciones, etc.

1

Desde mi punto de vista cuando dice Servicio que debe tener interfaces y si usted no puede proporcionar o no va a disponer que, a continuación, usted no tiene el contrato entre el servicio y el consumidor ya no es un servicio, puede llamarlo de otra manera

Cuestiones relacionadas