【问题标题】:Enums as value objects and modularisation枚举作为值对象和模块化
【发布时间】:2013-09-10 10:19:40
【问题描述】:

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

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

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

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

有没有更好的方法来做到这一点?我是否采取了一种不是“Grails 方式”的方法?

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

【问题讨论】:

    标签: grails plugins enums


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的意见!问题是,目前我需要为每个插件将一个大 Enum 拆分为较小的 Enum,并且我还需要有这个 Enum 的所有值的集中版本(因此包括所有插件中定义的值)来显示它们。我非常相信 Enums 无法做到这一点,我同意可能需要一种不同的方法来解决这个问题:)
    【解决方案2】:

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

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

         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)
           }
        }
    

    【讨论】:

    • 嘿,谢谢!我不是这个解决方案的忠实拥护者,因为它会传输我不想要的数据库中的枚举。
    • 还有另一个 hack。在 groovy 中,枚举默认不是最终的。所以你可以在运行时改变值,但这很糟糕 =)
    • 呃,我也不会那样做 :))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多