2012-05-17 9 views
12

Hizmetimi Groovy/src sınıfında enjekte etmek istiyorum.Grails 2.x enjeksiyon hizmeti Groovy/src

... 
def myService 
... 

I (çalışır) bu kullanabilmek için kulüpler:

def appCtx = ApplicationHolder.application.getMainContext() 
def myService = appCtx.getBean("myService"); 

ama ApplicationHolder kullanımdan kaldırılmıştır normaln bağımlılık enjeksiyon çalışmaz. Daha iyi bir çözüm var mı? Herhangi öneri

+0

Bu 'src sınıfını' nasıl kullanıyorsunuz? Nerede ve nasıl oluşturuyorsunuz? –

+0

Diğer Groovy sınıflarının içinde kullanıyorum (orada örneklendirildi). Tüm bu işlemleri tetikleyen bir hizmet tarafından kullanılan bir cephe groovy sınıfı vardır. Çok fazla parametre geçmemesi için kullanılan hizmeti parametre olarak geçmek istemiyorum ... – kuceram

cevap

12

kontrol kontrol edebilirsiniz Kaynaklar src/groovy - http://grails.org/FAQ#Q kaynaklarından uygulama içeriğine erişmek için SSS: src/groovy'deki kaynaklardan uygulama içeriğine nasıl erişebilirim?

ApplicationHolder'a eşdeğer bir ApplicationContextHolder sınıfı yoktur./Harika src bir Groovy sınıftan EmailService adlı bir hizmet sınıfına erişmek için kullanan Bahar fasulye erişmek:

ApplicationHolder yerine Holders olabilir
import org.codehaus.groovy.grails.web.context.ServletContextHolder as SCH 
import org.codehaus.groovy.grails.web.servlet.GrailsApplicationAttributes as GA 
def ctx = SCH.servletContext.getAttribute(GA.APPLICATION_CONTEXT) 
def emailService = ctx.emailService 
+1

Bu, bir hizmette yöntemlere erişmenize izin verirken, hizmet işlemlerini bozar. [Beyanname İşlemlerinden] alıntı (http://grails.org/doc/latest/guide/services.html#declarativeTransactions): *** Uyarı: bağımlılık enjeksiyonu, bildirimsel işlemlerin çalışmasının tek yoludur. Yeni operatör olarak yeni BookService() *** – ubiquibacon

+3

@ubiquibacon - evet ancak "def emailService = ctx.emailService" gibi bir işlem servisi kullanmazsınız.Üzgünüm, ancak böyle bir hizmete erişim sorunu nedir? – Saurabh

+0

Bunun "bağımlılık enjeksiyonu" olarak nitelendirildiğini düşünmüyorum. Bunu doğrulamak için bazı testler yapmak zorundayım. – ubiquibacon

2

Kolayca yeni kayıt olabilirsiniz için

Teşekkürler (veya mevcut geçersiz) grails-app/conf/spring/resources.groovy bunları yapılandırarak fasulye: Ayrıca

// src/groovy/com/example/MyClass.groovy 
class MyClass { 
    def myService 
    ... 
} 

// resources.groovy 
beans = { 
    myclass(com.example.MyClass) { 
     myService = ref('myService') 
    } 
} 

aşağıdaki bu soruyu yaklaşık How to access Grails configuration in Grails 2.0?

+0

Şimdi bunun benim için çalışmadığını görüyorum. ' ithalat com.path.to.ResidentAtPlace fasulye = { residentAtPlaceBean (ResidentAtPlace) { \t \t someProperty = 45 placeService = ref ('placeService': Bir hizmet veya böyle resources.groovy diğer özelliklerini bağlamak olamaz) \t \t grailsApplication = ref ('grailsApplication') } } ' her şey bir sorun görüyor musunuz benim ResidentAtPlace.groovy null nedir? Ben Grail 2.0.3 – kuceram

+0

kullanıyorum aynı bana, herhangi bir fikir neden olur? – mathifonseca

28

, ayrıca statik kapsamda kullanabilirsiniz:

// src/groovy/com/example/MyClass.groovy 
class MyClass { 
    def myService 
    ... 
} 

// resources.groovy 
beans = { 
    myclass(com.example.MyClass) { 
     myService = ref('myService') 
    } 
} 

ya da sadece autowired notunu kullanarak:

import grails.util.Holders 
... 

def myService = Holders.grailsApplication.mainContext.getBean 'myService' 
+0

, Grails 3.0'da da çalışıyor! – boraas

2

Yo resources.groovy yapabilirsin

// src/groovy/com/example/MyClass.groovy 

import org.springframework.beans.factory.annotation.Autowired 

class MyClass { 
    @Autowired 
    def myService 
    ... 
} 

// resources.groovy 
beans = { 
    myclass(com.example.MyClass) {} 
}