0

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

Currency.findByCode(Currency.DOLLAR)

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

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

4

2 回答 2

3

如果您使用静态变量,您可以做的另一件事来缩短代码是使用静态导入(这实际上是 Java 的一部分,但直到我转向 groovy 才找到它):

如果您在类的顶部进行 CurrencyType 的静态导入(可能是一个包含您定义的各种货币类型的枚举):

static import com.example.CurrencyType.*

在您的代码中,您不再需要为所有引用添加前缀CurrencyType,您可以这样做:

Currency.findByCode(DOLLAR)

如果它们不需要更改,您还可以在 Currency 类中添加一个辅助方法来检索它:

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
于 2010-12-11T20:21:43.710 回答
2

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

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

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

于 2010-12-11T16:59:46.970 回答