Grails: Dynamically inject service in domain class

前端 未结 3 1226
独厮守ぢ
独厮守ぢ 2021-02-06 13:33

I need to inject a service based on domain property, so far I came up with the following:

ApplicationHolder.application.getServiceClass(\"package.${property}Serv         


        
相关标签:
3条回答
  • 2021-02-06 13:55

    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.

    0 讨论(0)
  • 2021-02-06 13:58

    Yes. Services aren't injected into domain objects. If your domain object needs something for a particular use case, let the service that owns that use case invoke the other service on the domain object's behalf.

    0 讨论(0)
  • 2021-02-06 14:06

    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)
    
    0 讨论(0)
提交回复
热议问题