Grails:在域类中动态注入服务

时间:2010-05-11 20:18:10

标签: grails groovy dependency-injection service

我需要注入一个基于域属性的服务,到目前为止我想出了以下内容:

ApplicationHolder.application.getServiceClass("package.${property}Service").clazz

但以这种方式加载它不会注入它的依赖服务。我做错了吗?

3 个答案:

答案 0 :(得分:15)

新实例将绕过Spring的依赖管理;您需要从应用程序上下文中获取配置的单例bean。请改用:

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

假设'property'是服务的部分bean名称,即对于FooBarService,该属性必须是'fooBar'。如果它是'FooBar',那么您可以使用GrailsNameUtils.getPropertyName()来修复它:

import grails.util.GrailsNameUtils

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

答案 1 :(得分:3)

IMHO域类根本不应包含逻辑(除了验证器之外)。

在我的项目中,我通常会为每个域类创建一个服务(例如 UserService ,用于类用户)并且我将所有逻辑都粘贴在那里,即使是一小块碎片也是如此通常在域类中。

我认为很多来自Java / C ++世界的程序员往往会觉得这很难看,但它更适合Grails架构。

答案 2 :(得分:0)

是。服务不会注入域对象。如果您的域对象需要针对特定​​用例的内容,请让拥有该用例的服务代表域对象调用其他服务。