为我在 Grails 中的所有服务提供通用方法的好方法是什么?

What is a good way to provide common methods to all of my services in Grails?

你建议我使用 Inheritance、Mixins、ExpandoMetaClass 还是其他什么?

如果您的常用方法在很大程度上彼此相关,请使用包含它们的通用 class 的继承。

但是,如果您有不同的关注点并且将它们分组到多个文件中会受益,我建议 traits - 他们已弃用 Groovy 的 @Mixin 注释。

我用它们来装饰我的控制器,效果非常好。我在某处读到 Grails 团队也将使用它们来替换 'magic' metaclass 控制器等人工制品的装饰(这就是目前提供 render 等方法的方式)。找不到 link,但是 :(

如果您想将此行为添加到应用程序中的服务以及来自插件的服务中,请使用 GrailsApplication 中的 getServiceClasses() 动态方法并添加到它们的元类中,例如

def grailsApplication
....
grailsApplication.serviceClasses.each { sc ->
   sc.clazz.metaClass.foo = { bar -> ... }
}