【问题标题】:Accessing Grails services from src/groovy从 src/groovy 访问 Grails 服务
【发布时间】:2015-10-24 10:04:09
【问题描述】:

Grails 服务是用于在控制器之外实现业务逻辑(以及连接到支持服务/数据库等)的抽象。所以在一个典型的控制器中你可能有:

class DashboardController {
    StatisticsService statsService

    def index() {
        // Fetches all the stats that need to be displayed to the
        // admin on the dashboard.
        AdminDashboardMetrics adm = statsService.getAdminStats()

        render(view: "/dashboard", model: [ adm: adm ])
    }
}

在这里,Grails 自动将 DashboardController 注入 StatisticsService 的 bean 实例(当然前提是服务是使用 grails create-service ... 正确创建的)。

但是当我需要访问控制器的StatisticsService外部时会发生什么,特别是在src/groovy下?

// src/groovy/com/example/me/myapp/FizzBuzzer.groovy
class FizzBuzzer {
    StatisticsService statsService

    FizzBuzzer(StatisticsService statsService) {
        super()

        this.statsService = statsService
    }

    def doSomething(MyData input) {
        MoreData result = statsService.calculate(input)

        // use 'result' somehow, etc....
    }
}

如何正确地注入 FizzBuzzer 和相同的 StatisticsService 实例广告,传递到 DashboardController 的内容?

【问题讨论】:

    标签: grails dependency-injection


    【解决方案1】:

    你可以通过在 conf > spring 下的 resources.groovy 中定义注入登录来在 spring bean 中注入 grails 服务

    我在 src/groovy 中创建了一个 ExampleService 和 Example 类

    示例服务

    class ExampleService {
    
     def serviceMethod() {
        println "do something"
     }
    
    }
    

    src/groovy 下的示例类

    class Example {
    
    ExampleService exampleService
    
     def doSomething() {
        def result = exampleService.serviceMethod()
     }
    }
    

    conf>spring 下的resources.groovy

    beans = {
    
     ex(Example){ bean ->
        exampleService = ref('exampleService')
     }
    }
    

    所以我可以将 Example ex 定义为 grails-app 中的 spring bean,它会自行注入 ExampleService。

    希望这会有所帮助。谢谢

    【讨论】:

    • 如果 Example 不是,也不能是 bean 怎么办。换句话说,它需要动态构建以响应手头的任务,而不是在 XML 或 resources.groovy 中预先配置。当我尝试在 resources.groovy 中定义示例时,容器似乎试图为我实例化它,但这不是我想要的。我正在寻找如何将 grails 服务注入到一个普通的旧 groovy 对象中。
    【解决方案2】:

    您也可以使用grails.util.Holders获取服务

    例子:

    要注入 MyService 服务类,请使用Holders.applicationContext.getBean("myService")

    其中“myService”是您的服务类的名称,以小写形式表示。

    【讨论】:

      【解决方案3】:

      实现这一点的一种方法是使用 ServletContext-

      ApplicationContext ctx = (ApplicationContext)ServletContextHolder.
      
      getServletContext().getAttribute(GrailsApplicationAttributes.APPLICATION_CONTEXT)
      
      statisticsService = (StatisticsService ) ctx.getBean("statisticsService ")
      

      查看此博客 - http://www.grailsbrains.com/availing-grails-goodies-in-srcjava-or-srcgroovy/

      【讨论】:

        猜你喜欢
        • 2016-07-25
        • 2016-01-30
        • 2012-05-25
        • 2016-02-22
        • 2013-06-16
        • 2016-08-02
        • 2015-01-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多