2010-04-01 14 views
18

Documentación dice:Grails: Clases de Servicios VS Groovy

El equipo Griales desalienta la incorporación de la lógica de la aplicación principal controladores en el interior, ya que no promover la reutilización y una separación limpia de preocupaciones.

Tengo un controlador de API y algunas clases de Groovy en la carpeta src/groovy. Esas clases simplemente implementa mi lógica de aplicación para las acciones en el controlador de API funciona de esta manera:

//index page 
def index = { 
    render new IndexApi().index(params) as JSON 
} 

Tengo curiosidad - ¿hay alguna razón para mover la lógica de la aplicación de las clases maravilloso lisos en los servicios?

Respuesta

9

Si desea un comportamiento transaccional, debe poner su lógica en los Servicios. De lo contrario, tendrías que preocuparte por ti mismo, lo cual no está en el espíritu de usar Grails.

Al no ser un experto en grails, puse mis clases "no transaccionales" fuera de la capa de servicio, como clases de compilador, ayudantes y otra lógica que no es transaccional pero que se usa desde la capa de servicio.

7

Hay tres razones:

  1. que hace que el controlador más pequeño -> más fácil de entender y mantener

  2. Te hace más fácil poner a prueba la lógica.

  3. Realmente no desea administrar sus transacciones manualmente.

Si desea poner todo en el controlador, lo que se necesita para crear el tiempo de ejecución web para ser capaz de ejecutar cualquier prueba. Si su lógica está afuera, puede copiar los datos que necesita de la solicitud HTTP y de todas las otras fuentes y simplemente llamar al código. Entonces, la lógica no depende de las sesiones HTTP, las solicitudes o cualquier otra cosa que no desee.

Por ejemplo, para probar JSP, necesita una HTTPRequest. Para una solicitud, necesita una sesión HTTPS y un JSPWriter. Esos necesitan un contexto de sesión. Entonces, para poder ejecutar una única prueba, debe configurar e inicializar un montón de clases. Y todas esas son interfaces y las implementaciones son privadas. Por lo tanto, debe implementar los métodos reales (todos los 300) usted mismo. Y será mejor que lo hagas bien o tus pruebas no probarán lo que quieres.

20

En realidad, los servicios no se limitan a transacciones. Los servicios son geniales para los componentes singleton inyectables de configuración cero, y pueden volver a cargarse sin reiniciar todo el entorno de grails, Y se pueden descubrir como artefactos y, por lo tanto, se exponen automáticamente con complementos remotos.