ベストプラクティス - 静的フィールドでグレイルでドメインオブジェクトを取得しますか?
-
08-10-2019 - |
質問
したがって、いくつかのGrailsオブジェクト(REFデータ)には一意の「コード」があり、それらを取得したい場合は、静的コードでそれらを呼び出すことでそうします。
Currency.findByCode(Currency.DOLLAR)
おそらく私は完全に間違っているかもしれませんが、これは非常に冗長でないオブジェクトを取得するための非常に冗長でない方法のように思えます(特に、複数のオブジェクトについて複数回やらなければならない場合)。
より受け入れられているアプローチはありますか(おそらくどこかにオブジェクト自体を参照しているかもしれません)?これが最良の方法である場合、それは許容可能な答えです。ありがとう。
解決
場合によります。これは参照データのようです。参照データが変更されない場合、永続レイヤーをまったく使用しません。静的参照データである静的変数の束をコーディングします。
再配置せずに参照データを変更できるようにしたい場合、最も実用的な方法は、DBからそれらをロードすることです。データを操作できる何らかの管理画面があります。 Ehcacheのような2番目のレベルのキャッシュを使用して、永続レイヤーが実際にDBにヒットする量を制限します。この方法で本当に良いパフォーマンスを得ることができます。ユーザーガイドのセクション5.5.2.2を参照してください。
ただし、現在のアプローチを使用すると、Currency.Dollarをコード化する必要があるため、参照データの変更について再展開する必要があります。おそらく、それを行う必要がないでしょう。
他のヒント
静的変数を使用する場合にコードを短縮するためにできることの1つは、静的インポートを使用することです(これは実際にはJavaの一部ですが、グルーヴィーに移動するまで見つけられませんでした):
クラスの上部で、currencyType(潜在的には、定義したさまざまな種類の通貨を保持している列挙)の静的なインポートを行う場合:
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