在Grails中使用特征进行水平域类重用,这是一个好主意吗?

duk*_*ing 2 grails groovy grails-orm

所以我想创建3个插件,其中包括域类和一个宁静的服务,以及每个插件彼此构建的人.

从概念上讲,他们会以这种方式"继承"基础模型:

记录>人>用户

但是,我从"友好手册"中读到,继承可能会导致一些性能问题.

然后我突然想到,既然Groovy具有水平重用功能(即特征),我可以很好地定义特征中的所有内容,然后在域类中实现特征.

由于字段的重命名,以及IDE自动完成的便利性的丧失,编写域类不是我的选择.

我的两个问题是:

  • 在Grails项目结构的哪个部分最好放置这些特征.
  • 这会导致不同的问题吗?

Emm*_*osa 5

Trait源代码应该在

  1. Grails 2:src/groovy/[package] [whatever.groovy]
  2. Grails 3:src/main/groovy/[package] [whatever.groovy]

例如: src/main/groovy/com/my/package/foo.groovy

您将遇到的主要问题是您将失去执行多态查询的能力.例如,通过继承,您可以执行以下操作:

def everything = Record.list()
Run Code Online (Sandbox Code Playgroud)

并且everything将包含Record,Person以及User实例.有点像SQL联合查询.使用Traits而不是继承时,你会失去这种能力.