因此,我们的一些 grails 对象(引用数据)有独特的“代码”,当我们想要检索它们时,我们通过使用它们的静态代码调用它们来实现:

Currency.findByCode(Currency.DOLLAR)

也许我完全错了,但这似乎是一种非常冗长且非常规的检索对象的方式(特别是当您必须为多个对象执行多次时)。

是否有更可接受的方法(也许在某处引用对象本身)?如果这是最好的方法,那么这是一个可以接受的答案。谢谢。

有帮助吗?

解决方案

这取决于。这看起来像是参考数据。如果参考数据永远不会改变,我根本不会使用持久层——我会编写一堆静态变量作为静态参考数据。

如果您希望能够更改参考数据而不重新部署,最实用的方法是从数据库加载它们。您将拥有某种类型的管理屏幕,您可以在其中操作数据。您可以使用像 ehcache 这样的二级缓存来限制持久层实际访问数据库的数量——这样您可以获得非常好的性能。请参阅用户指南第 5.5.2.2 节。

但是,使用您当前的方法,您必须根据参考数据的更改重新部署,因为需要编码Currency.DOLLAR。不必这样做可能会很好。

其他提示

如果您使用静态变量,则可以做的另一件事是缩短代码,就是使用静态导入(这实际上是Java的一部分,但是直到搬到Groovy之前,我才发现它):

如果您在班级顶部进行货币类型的静态导入(可能是持有所定义的各种货币的枚举):

static import com.example.CurrencyType.*

在您的代码中,您不再需要将所有参考的前缀带有 CurrencyType, ,您可以做:

Currency.findByCode(DOLLAR)

如果他们不需要更改,您也可以在您的货币类中添加辅助方法来检索它:

Currency.groovy:
static import com.example.CurrencyType.*
...
static transients = ['dollar']
...
static Currency getDollar() {
    Currency.findByCode(DOLLAR)
}

那会让你使用 Currency.dollar 在您的其他代码中。在这些课程中,您也可以在那里使用静态导入来指参考 dollar:

static import com.example.Currency.*
....
println dollar // gets the dollar from the db and prints it out
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top