Les meilleures pratiques - Obtenir un objet de domaine dans Grails par un champ statique?

StackOverflow https://stackoverflow.com/questions/4417748

  •  08-10-2019
  •  | 
  •  

Question

Nous avons donc « codes » uniques pour certains de nos objets Grails (données ref), et quand nous voulons les récupérer, nous le faisons en les appelant par leur code statique:

Currency.findByCode(Currency.DOLLAR)

Peut-être que je suis tout à fait tort, mais cela semble être une manière très bavard et non groovy de récupérer des objets (surtout quand vous devez le faire plusieurs fois, pour plusieurs objets).

Y at-il une approche plus acceptée (ayant peut-être une référence à l'objet lui-même quelque part)? Si c'est la meilleure façon de le faire, c'est une réponse acceptable. Merci.

Était-ce utile?

La solution

Cela dépend. Cela semble des données de référence. Si les données de référence ne va pas changer, je ne voudrais pas utiliser la couche de persistance du tout -. Je coderez un tas de variables statiques qui sont les données de référence statique

Si vous voulez être en mesure de modifier vos données de référence sans redéployer, la manière la plus pratique serait de les charger à partir du db. Vous auriez un certain type d'écran d'administration où vous pouvez manipuler les données. Vous devez utiliser le cache de niveau 2 comme ehcache pour limiter la quantité de la couche de persistance a frappé en fait la db - vous pouvez vraiment obtenir une bonne performance de cette façon. Voir la section 5.5.2.2 du guide de l'utilisateur.

Cependant, avec votre approche actuelle vous devez redéployer sur un changement dans vos données de référence, car la nécessité Currency.DOLLAR à coder. Ce serait probablement agréable de ne pas avoir à le faire.

Autres conseils

Une autre chose que vous pourriez faire pour raccourcir le code si vous utilisez des variables statiques est d'utiliser les importations statiques (ce qui est en fait une partie de Java, mais je ne trouve pas jusqu'à ce que je me suis déplacé à groovy):

Si vous faites une importation statique de CurrencyType (potentiellement un ENUM tenant les différents types de devises que vous avez défini) en haut de votre classe:

static import com.example.CurrencyType.*

vers le bas dans votre code, vous ne avez plus besoin de préfixer toutes les références avec CurrencyType, vous pouvez simplement faire:

Currency.findByCode(DOLLAR)

S'ils ne ont pas besoin de changement, vous pouvez également ajouter une méthode d'aide à votre classe de devises pour le récupérer:

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

Cela vous permettra d'utiliser Currency.dollar dans votre autre code. Dans ces classes, vous pouvez également utiliser une importation statique là pour se référer juste dollar:

static import com.example.Currency.*
....
println dollar // gets the dollar from the db and prints it out
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top