0

我是 grails 的新手,因此提出了这个问题。我们可以在服务中获取 grails 控制器的实例吗?我知道这是一个糟糕的设计,但我现在的问题是 grails 控制器有一些属性,如渲染、重定向、flash、我想在服务中使用的消息。我怎样才能做到这一点 ?

4

2 回答 2

3

一般建议是“不要”。服务用于可重用的逻辑和事务性数据库操作,通常不应该知道 Web 层的东西,如会话/闪存/重定向等。

更好的设计可能是让服务方法返回一个值,然后控制器使用该值发出适当的重定向。或者,如果您需要访问闪存,请将对它的引用从控制器传递给服务方法

class SomeService {
  void storeInMap(map, k, v) { map[k] = v}
}

class SomeController {
  def someService

  def act1() {
    someService.storeInMap(flash, "hello", "world")
  }
}

对于渲染模板和处理 i18n 消息,有一些替代方法,分别是groovyPageRenderermessageSource Spring beans。

于 2013-06-12T07:31:18.390 回答
2

当然,您可以简单地将这些控制器属性传递给服务(假设服务是从控制器调用的),但总的来说我不推荐这样做。这里有一些替代方案

闪光

您可以通过以下方式从任何地方访问闪存范围:

def flashScope = WebUtils.retrieveGrailsWebRequest().flashScope

信息

messageSource您可以通过依赖注入bean从服务中的属性文件中获取 i18n 消息,例如

class MyService {

  MessageSource messageSource

  def getMsg() {
    messageSource.getMessage('key', ['arg1', 'arg2'].toArray(), Locale.default)
  }
}

使成为

使用pageRendererbean 从服务中呈现模板,例如

class MyService {

  PageRenderer pageRenderer

  def getTemplateContent() {
    pageRenderer.render(template: '/some/template', model: [email: 'me@something.com'])

  }
}
于 2013-06-12T13:46:38.533 回答