我是grails的新手,因此这个问题。我们可以在服务中获得grails控制器的实例。 我知道这是一个糟糕的设计,但我现在的问题是Grails控制器有一些属性,如渲染,重定向,闪存,我想在服务中使用的消息。我怎么能这样做?
答案 0 :(得分:3)
一般建议是“不要”。服务用于可重用的逻辑和事务数据库操作,通常不应该知道诸如会话/ flash /重定向等web层事物。
更好的设计可能是让服务方法返回一个值,然后控制器使用该值来发出适当的重定向。或者,如果您需要访问闪存,请将控制器的引用传递给服务方法
class SomeService {
void storeInMap(map, k, v) { map[k] = v}
}
class SomeController {
def someService
def act1() {
someService.storeInMap(flash, "hello", "world")
}
}
对于渲染模板和处理i18n消息,有其他方法,分别是groovyPageRenderer和messageSource Spring bean。
答案 1 :(得分:2)
当然你可以简单地将这些控制器属性传递给服务(假设从控制器调用服务),但一般情况下我不建议这样做。以下是一些替代方案
您可以通过以下任意位置访问闪存范围:
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'])
}
}