我们可以在grails中的服务中获得控制器的实例吗

我们可以在grails中的服务中获得控制器的实例吗,grails,gorm,grails-plugin,Grails,Gorm,Grails Plugin,我是grails的新手,因此提出了这个问题。我们可以在服务中获得grails控制器的实例吗。 我知道这是一个糟糕的设计,但我现在的问题是grails controller具有一些属性,如render、redirect、flash和message,我希望在服务中使用这些属性。我该怎么做呢?一般的建议是“不要”。服务用于可重用的逻辑和事务性数据库操作,通常不应该知道web层的事情,如会话/闪存/重定向等 更好的设计可能是让服务方法返回一个值,然后控制器使用该值发出适当的重定向。或者,如果需要访问闪存

我是grails的新手,因此提出了这个问题。我们可以在服务中获得grails控制器的实例吗。 我知道这是一个糟糕的设计,但我现在的问题是grails controller具有一些属性,如render、redirect、flash和message,我希望在服务中使用这些属性。我该怎么做呢?

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

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

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

class SomeController {
  def someService

  def act1() {
    someService.storeInMap(flash, "hello", "world")
  }
}
对于呈现模板和处理i18n消息,有替代方法,即分别使用和Springbeans。

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

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

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

class SomeController {
  def someService

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

对于呈现模板和处理i18n消息,有其他方法,即分别使用和SpringBean。

当然,您可以简单地将这些控制器属性传递到服务中(假设服务是从控制器调用的),但通常我不建议这样做。这里有一些替代方案

闪光 您可以使用以下工具从任何位置访问flash示波器:

def flashScope = WebUtils.retrieveGrailsWebRequest().flashScope
消息 通过依赖注入
messageSource
bean,您可以从服务中的属性文件获取i18n消息,例如

class MyService {

  MessageSource messageSource

  def getMsg() {
    messageSource.getMessage('key', ['arg1', 'arg2'].toArray(), Locale.default)
  }
}
提供 使用
pageRenderer
bean从服务呈现模板,例如

class MyService {

  PageRenderer pageRenderer

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

  }
}

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

闪光 您可以使用以下工具从任何位置访问flash示波器:

def flashScope = WebUtils.retrieveGrailsWebRequest().flashScope
消息 通过依赖注入
messageSource
bean,您可以从服务中的属性文件获取i18n消息,例如

class MyService {

  MessageSource messageSource

  def getMsg() {
    messageSource.getMessage('key', ['arg1', 'arg2'].toArray(), Locale.default)
  }
}
提供 使用
pageRenderer
bean从服务呈现模板,例如

class MyService {

  PageRenderer pageRenderer

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

  }
}