2012-05-21 10 views
9

Tengo varios servicios que implementan una interfaz común y deseo poder elegir uno de ellos para inyectar en otros servicios cuando se inicia mi aplicación.¿Cómo seleccionar una implementación de servicio en una aplicación Grails?

He intentado hacer referencia a la implementación del servicio desde resources.groovy como se muestra a continuación, pero luego Spring hace una nueva instancia del servicio seleccionado y no conecta automáticamente sus dependencias.

¿Cómo puedo conseguir que esta solución funcione? ¿O hay otra manera?

class MyService { 

    Repository repository 

    interface Repository { 
     void save(...) 
    } 
} 

class MySqlRepositoryService implements MyService.Repository { ... } 

class FileRepositoryService implements MyService.Repository { ... } 

resources.groovy:

beans = { 
    ... 
    repository(FileRepositoryService) { } 
} 

Respuesta

3

Es por supuesto posible recuperar la referencia al servicio de la fábrica construido a mano, pero en mi opinión, el enfoque que ha tomado es la mejor. Lo uso yo mismo, porque reúne toda la información sobre la fase de configuración de la aplicación en un solo lugar, por lo que es más fácil rastrear qué implementación se utiliza.

La trampa con el autoenvío que ha encontrado se puede explicar muy fácilmente. Todas las clases introducidas en grails-app/services son configuradas automáticamente por Grails como beans Singleton Spring con autoencendido por nombre. Por lo tanto, la definición de beans que ha colocado en grails-app/conf/resources.groovy crea otro bean, pero sin los valores predeterminados impuestos por las convenciones de Grails.

La solución más sencilla es poner la aplicación en src/groovy para evitar la duplicación de los granos y utilizar la siguiente sintaxis para encender la autowiring:

beans = { 
    repository(FileRepositoryService) { bean -> 
    bean.autowire = 'byName' 
    } 
} 
+0

Así que, esencialmente mis repositorios serán los granos de primavera normales y no los servicios de Grails . Eso funcionará muy bien. ¡Gracias! –

Cuestiones relacionadas