1

我想将 Grails 应用程序拆分为更小的插件。一些域类具有枚举类型的属性。这些枚举中的一些值在逻辑上将成为插件的一部分,因此我正在寻找一种方法让每个插件将其自己的值注册到“核心”枚举中。

显然,这不能用 Enums 完成,因为它们不能在运行时修改。

我看到的一个选择是将每个 Enum 替换为具有静态属性的类,并添加一个静态方法来从插件注册新值。这会产生以下后果:

  • GORM 将不知道为假 Enum 值存储什么,因此它会抛出异常
  • 因此,我必须将这些属性的类型更改为字符串,这样它仍然可以使用存储中的当前值,但是我失去了查看该属性可以在何处获取其值的优势。

有一个更好的方法吗?我是否采取了一种不是“Grails 方式”的方法?

最后,我正在寻找一种在核心应用程序中为插件做扩展点的方法,就像我在 Java 中使用 ServiceProvider 所做的那样。

4

2 回答 2

1

我有一种感觉,你把这个问题复杂化了,我会根据它们现在的类型在不同的文件中定义枚举,然后在你的应用程序中使用它们。我个人更喜欢按类型而不是应用程序对枚举进行分组,但这取决于您的设计。

关于扩展点,如果您在核心插件中定义它们,则根据 Grails 插件的性质,您将具有可扩展性。这意味着您的应用程序可以覆盖或扩展这些值。希望这可以帮助

于 2013-09-10T13:16:18.397 回答
0

我在开发过程中遇到了同样的问题。我找到了一种解决方案。

使用插件将您的枚举转移到域和初始化值。制作静态方法来获取值,因此域看起来像枚举。例如:

     class Person { 
       String name

       static mapping = {
            cache usage: 'read-only'
            table 'Person '
            id column: 'Person ID', generator: 'identity'
            name column: 'Name'
       }

       static Person getJOHN() {
            getByName('John')
       }

       static Person getByName(String name) {
            Person.findByName(name)
       }
    }
于 2013-09-11T07:31:16.510 回答