2012-05-17 5 views
12

サービスをGroovy/srcクラスに挿入したいと思います。Groovy/srcのGrails 2.xサービスインジェクション

... 
def myService 
... 

は、私は(それが動作します)これを使用することができるよ::

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

をしかしApplicationHolderは推奨されませんnormalnの依存性の注入は動作しません。もっと良い解決策はありますか?どんな提案

+0

この「srcクラス」はどのように使用しますか?どこでどのようにインスタンス化するのですか? –

+0

私は他のGroovyクラスの中でそれを使用します(インスタンス化されています)。サービスによって使用されるfacade groovyクラスがあり、そのすべてのプロシージャをトリガします。あまりにも多くのパラメータを渡さないために、使用されたサービスをパラメータとして渡す必要はありません。 – kuceram

答えて

12

チェックを確認することができますsrc/groovyのソースからアプリケーションコンテキストにアクセスするためのGrails FAQ - http://grails.org/FAQ#Q:src/groovyのソースからアプリケーションコンテキストにアクセスするにはどうすればよいですか?

ApplicationHolderに相当するApplicationContextHolderクラスはありません。 SRC /グルーヴィーでGroovyのクラスからEmailServiceと呼ばれるサービスクラスにアクセスするには、使用してのSpring Beanにアクセス:

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

これにより、サービス内のメソッドにアクセスできるようになりますが、サービスのトランザクション性が損なわれます。 [宣言的トランザクション](http://grails.org/doc/latest/guide/services.html#declarativeTransactions)からの抜粋:***警告:宣言的トランザクションが機能する唯一の方法は依存性注入です。新しいBookService()*** – ubiquibacon

+3

@ubiquibacon - はいのような新しい演算子を使用する場合、トランザクションサービスは得られませんが、 "def emailService = ctx.emailService"はトランザクションサービスになります。申し訳ありませんが、このようなサービスにアクセスする際の問題は何ですか? – Saurabh

+0

私はそれが "依存性注入"とはみなされません。私はそれを確認するためにいくつかのテストを行う必要があります。 – ubiquibacon

2

あなたは簡単に新しい登録できるため

おかげで(または既存の上書き)grails-app/conf/spring/resources.groovyでそれらを構成することにより、豆:また

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

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

を使用すると、以下のこの質問についてHow to access Grails configuration in Grails 2.0?

+0

これは私のためには機能しません。 'インポートcom.path.to.ResidentAtPlace 豆= { residentAtPlaceBean(ResidentAtPlace){ \t \t somePropertyが= 45 placeService = REF( 'placeService':私はこのようresources.groovyにサービス又は他の特性を結合することができません) \t \t grailsApplication = REF( 'grailsApplication') }} ' すべてはあなたがどんな問題を参照してください、私のResidentAtPlace.groovyにnullの?私はGrail 2.0.3を使用しています – kuceram

+0

同じことが私に起こります。 – mathifonseca

28

ApplicationHolderの交換がHoldersすることができ、あなたはまた、静的スコープでそれを使用することができます。

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

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

をあるいは単にautowired注釈を使用して::

import grails.util.Holders 
... 

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

もGrails 3.0で動作します! – boraas

2

resources.groovyからそれを行うことができます

// 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) {} 
} 
関連する問題