你如何在不同的grails控制器中共享常用方法?

fab*_*474 26 model-view-controller grails grails-controller

目前,当我需要共享processParams(params)不同控制器之间的方法时,我使用继承或服务.这两种解决方案都有一些不便之处:

  • 使用继承,您不能使用多重继承,这意味着您需要在一个位置拥有所有控制器实用程序方法.而且,grails中存在一个错误,它在开发模式下没有检测到基本控制器类中的任何代码更改(您需要重新启动应用程序)
  • 使用服务,您无法访问所有注入的属性,如params,session,flush ...

所以我的问题是:有没有其他方法可以使用一些可用于多个控制器的常用方法?

ata*_*lor 22

我喜欢的一个选项是将常用方法编写为类别,然后根据需要将其混合到控制器中.它提供了比继承更多的灵活性,可以访问诸如params之类的东西,并且代码简单易懂.

这是一个很小的例子:

@Category(Object)
class MyControllerCategory {
    def printParams() {
        println params
    }
}

@Mixin(MyControllerCategory)
class SomethingController {

    def create = {
        printParams()
        ...
    }

    def save = {
        printParams()
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 实际上,您不需要`@ Category`注释来使用`@Mixin`注释. - 当你使用替代方法`SomethingController.mixin([MyControllerCategory])`(它需要`MyControllerCategory`来提供`static`方法`printParams()`)时,你只需要它.Groovy文档提供与您类似的示例,但这不是必需的. - 这种误解可能是因为*categories*的使用经历了一个渐进过程 - 一旦语法笨拙,现在被`@Mixin`注释所取代. (7认同)
  • 如果您使用此模式,并使用Spock进行问题测试,其中混合类在Spock测试之间重置,请在此处查看解决方案:[link](http://grails.1312388.n4.nabble.com/Call -a-方法 - 上的靶级-时-使用-自有TestMixin-td4637497.html#a4637776) (3认同)
  • `traits`正在取代`@Mixin`,而`@ Mixin`已被Groovy 2.3弃用.有关特征的更多信息:http://stackoverflow.com/questions/23121890/difference-between-delegate-mixin-and-traits-in-groovy#answer-23124968&http://www.mscharhag.com/groovy/groovy-介绍,性状 (3认同)
  • 最后,`@Mixin`和`@ Delegate`之间的主要区别在于*delegate*方法被静态编译到目标类中,而*mixin*方法在运行时被调用. (2认同)

Jar*_*red 3

这无助于您在开发模式下重新启动问题,但这是我解决此问题的方式。这很丑陋,而且可能不是一个好的实践,但我将通用代码作为闭包分解到类中。然后我可以做类似的事情:

new ControllerClosures().action(this)
Run Code Online (Sandbox Code Playgroud)

以及来自controllerClosures类中的with

def action={
    it.response.something
    return [allYourData]
}
Run Code Online (Sandbox Code Playgroud)