2012-05-21 1 views
9

Ho diversi servizi che implementano un'interfaccia comune e voglio essere in grado di sceglierne uno da iniettare in altri servizi all'avvio dell'applicazione.Come selezionare un'implementazione del servizio in un'applicazione Grails?

Ho provato a fare riferimento all'attuazione del servizio da resources.groovy come illustrato di seguito, ma in seguito Spring crea una nuova istanza del servizio selezionato e non esegue la copia delle relative dipendenze.

Come posso far funzionare questa soluzione? oppure c'è un'altro modo?

class MyService { 

    Repository repository 

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

class MySqlRepositoryService implements MyService.Repository { ... } 

class FileRepositoryService implements MyService.Repository { ... } 

resources.groovy:

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

risposta

3

E 'naturalmente possibile recuperare il riferimento al servizio dalla fabbrica costruito a mano, ma a mio parere, l'approccio che hai preso è il migliore. Lo uso da solo, perché raccoglie tutte le informazioni sulla fase di configurazione dell'applicazione in un'unica posizione, quindi è più facile rintracciare quale implementazione è utilizzata.

Il trabocchetto con autowiring che hai incontrato può essere spiegato molto facilmente. Tutte le classi inserite in grails-app/services vengono automaticamente configurate da Grails come bean singleton Spring con autowiring per nome. Quindi la definizione di bean che hai inserito in grails-app/conf/resources.groovy crea un altro bean, ma senza i valori di default imposti dalle convenzioni di Grails.

La soluzione più semplice è quello di mettere l'implementazione in src/groovy per evitare la duplicazione di fagioli e utilizzare la seguente sintassi per attivare l'autowiring:

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

Quindi, in sostanza i miei archivi saranno normali bean Spring e non i servizi Grails . Funzionerà bene. Grazie! –