2010-05-11 9 views

Odpowiedz

15

Nowe instancje omijają zarządzanie zależnościami Spring; musisz pobrać skonfigurowany komponent singleton bean z kontekstu aplikacji. Użyj tego zamiast:

def service = ApplicationHolder.application.getMainContext().getBean("${property}Service") 

który zakłada, że ​​„własność” jest częściową nazwę fasola za usługę, to znaczy dla FooBarService, obiekt musiałby być „foobar”. Jeśli to „foobar” można użyć GrailsNameUtils.getPropertyName(), aby je naprawić: zajęcia domen

import grails.util.GrailsNameUtils 

String beanName = GrailsNameUtils.getPropertyName(property) + 'Service' 
def service = ApplicationHolder.application.getMainContext().getBean(beanName) 
+0

Yay, to działa. Próbowałem metody getBean, ale przekazywałem do niej "FooBar" :) – rukoche

+0

Powyższe nie działało dla mnie, dopóki nie zastąpiłem '.getMainContext' z' .getMainContext(). ' – sebnukem

+0

Dzięki, naprawiłem to po zobaczeniu, że twoje edycja została niepoprawnie odrzucona –

0

Tak. Usługi nie są wstrzykiwane do obiektów domeny. Jeśli obiekt domeny potrzebuje czegoś dla konkretnego przypadku użycia, niech usługa, która jest właścicielem tego przypadku użycia, wywoła inną usługę w imieniu obiektu domeny.

+2

Dowolny komponent Spring bean może być wstrzykiwany do klas domeny, tak jak w kontrolerach, tj. "Def fooService". Najczęstszym tego przykładem jest wywołanie usługi w niestandardowym walidatorze. –

+0

Może być; Po prostu nie zgadzam się, że tak powinno być. Walidator różni się od obiektu domeny, takiego jak Konto lub Osoba. To zupełnie inny przypadek użycia. – duffymo

3

IMHO nie powinien zawierać logiki w ogóle (oprócz utworzenia weryfikatorów).

W moich projektach normalnie utworzyć usługę dla każdej klasy domeny (np UserService dla klasy użytkownika) i trzymać wszystkie logiki tam, nawet małe kawałki w kawałkach, które normalnie byłyby w klasie domeny.

Myślę, że wielu programistów pochodzących ze środowiska Java/C++ często uważa to za brzydkie, ale lepiej pasuje do architektury Grails.

+3

To prawda, że ​​klasy domenowe Grails nie są odpowiednie dla logiki, ale szkoda, ponieważ muszę zgodzić się z Fowlerem na ten temat: http://pl.wikipedia.org/wiki/Anemic_Domain_Model – Kimble

+1

Rzeczywiście Eric Evans prawdopodobnie odczuł zakłócenia w działaniu, gdy ktoś powiedział, że "klasy domenowe nie powinny w ogóle zawierać logiki". To brzmi jak anty-wzór obiektu domeny i jest całkowicie sprzeczne z Projektowaniem opartym na Domenie. –

+0

W moim przypadku chciałbym ustawić indeks TTL na podstawie środowiska grails. Jaki jest lepszy wzór? – Kirby