I need to inject a service based on domain property, so far I came up with the following:
ApplicationHolder.application.getServiceClass("package.${property}Service").clazz
but loading it this way doesn't inject it's dependent services. Am I doing it wrong?
New instances will bypass Spring's dependency management; you need to get the configured singleton bean from the application context. Use this instead:
def service = ApplicationHolder.application.getMainContext().getBean("${property}Service")
That assumes that 'property' is the partial bean name for a service, i.e. for FooBarService, the property would have to be 'fooBar'. If it's 'FooBar' then you can use GrailsNameUtils.getPropertyName() to fix it:
import grails.util.GrailsNameUtils
String beanName = GrailsNameUtils.getPropertyName(property) + 'Service'
def service = ApplicationHolder.application.getMainContext().getBean(beanName)
IMHO domain classes shouldn't contain logic at all (apart form the validators).
In my projects I normally create a service for each domain class (e.g. UserService for class User) and I stick all the logic in there, even small bits in pieces that would normally be in the domain class.
I think a lot of programmers coming from Java/C++ world tend to find this ugly, but it suits better the Grails architecture.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With