2010-12-11 3 views
0

Таким образом, мы имеем уникальные «коды» для некоторых из наших Grails объектов (данные реф), и когда мы хотим, чтобы получить их, мы делаем это, называя их своим статическим кодом:Лучшая практика - Получение объекта домена в grails статическим полем?

Currency.findByCode(Currency.DOLLAR) 

Может быть, я совершенно неправильно, но это похоже на очень многословный и несовместимый способ извлечения объектов (особенно, когда вам приходится делать это несколько раз, для нескольких объектов).

Есть ли более приемлемый подход (возможно, где-то есть ссылка на объект)? Если это лучший способ сделать это, это приемлемый ответ. Благодарю.

ответ

2

зависит от цели. Это похоже на справочные данные. Если ссылочные данные никогда не будут меняться, я бы не использовал слой persistence вообще - я бы закодировал кучу статических переменных, которые являются статическими ссылочными данными.

Если вы хотите иметь возможность изменять свои исходные данные без перераспределения, наиболее практичным способом было бы загрузить их из базы данных. У вас будет какой-то экран администратора, где вы можете манипулировать данными. Вы использовали бы кеш второго уровня, например, ehcache, чтобы ограничить, насколько уровень настойчивости на самом деле попал в db - вы можете получить действительно хорошую производительность таким образом. См. Раздел 5.5.2.2 руководства пользователя.

Однако, при вашем текущем подходе вам придется перераспределять изменения в ваших справочных данных, потому что необходимо закодировать Currency.DOLLAR. Возможно, было бы неплохо не делать этого.

+0

@igs, подразумевалось, что я думаю. ;) В любом случае вы на правильном пути;) – hvgotcodes

3

Еще одна вещь, которую вы могли бы сделать, чтобы сократить до кода, если вы используете статические переменные, чтобы использовать статические импорта (это на самом деле часть Java, но я не нашел его, пока я не переехал в Groovy):

Если вы статический импорт 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 
Смежные вопросы