10

コントローラーから、パラメーターに基づいてサービスを動的に選択したいと思います。

現在、私は基本サービスと、この基本サービスを拡張する他のいくつかのサービスを持っています。パラメータに基づいて、パラメータに基づいて Bean 名を作成し、最終的に以下を呼び出すクラスを呼び出します。

import org.codehaus.groovy.grails.web.context.ServletContextHolder as SCH
import org.codehaus.groovy.grails.web.servlet.GrailsApplicationAttributes as GA

class Resolver {
    def ctx

def getBean(String beanName) {
    if(!ctx) {
        ctx = SCH.servletContext.getAttribute(GA.APPLICATION_CONTEXT)
    }
    return ctx."${beanName}"
}

}

これにより、必要なサービスが返されます。しかし、私はこの方法でそれを行うとかなり汚いと感じます. 何らかのパラメーターに基づいてサービス (ま​​たは他の Bean) を取得するより良い方法はありますか?

ありがとうございました。

4

1 に答える 1

13

ctx."${beanName}"ApplicationContextのようなことができるように、メタクラスに追加されますdef userService = ctx.userService。これは単なるショートカットなctx.getBean('userService')ので、コードを次のように変更できます

return ctx.getBean(beanName)

それは同じですが、それほど魅力的ではありません。

コントローラーまたはサービスからこれを呼び出しているので、私はものをスキップして、 Bean ( ) をServletContextHolder依存性注入し、を介して取得することでコンテキストを取得します。次に、それをこのヘルパー クラスに渡します (Spring の大きなパラダイムは、古い学校の依存関係のプルではなく、依存関係の注入であることを思い出してください)。grailsApplicationdef grailsApplicationdef ctx = grailsApplication.mainContext

class Resolver {
   def getBean(ctx, String beanName) {
      ctx.getBean(beanName)
   }
}

しかし、それは非常に単純なので、ヘルパークラスをまったく気にしません:)

于 2012-12-19T16:29:53.327 に答える