我需要注入一个基于域属性的服务,到目前为止我想出了以下内容:
ApplicationHolder.application.getServiceClass("package.${property}Service").clazz
但以这种方式加载它不会注入它的依赖服务。我做错了吗?
答案 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)
是。服务不会注入域对象。如果您的域对象需要针对特定用例的内容,请让拥有该用例的服务代表域对象调用其他服务。