我需要根据域属性注入一个服务,目前我想到了以下方法:
ApplicationHolder.application.getServiceClass("package.${property}Service").clazz
但是这种方式加载不会注入它所依赖的服务。我做错了吗?
ApplicationHolder.application.getServiceClass("package.${property}Service").clazz
但是这种方式加载不会注入它所依赖的服务。我做错了吗?
新的实例将会绕过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)
我认为领域类不应该包含任何逻辑(除了验证器)。
在我的项目中,我通常为每个领域类创建一个服务(例如,对于类“User”,我创建一个名为“UserService”的服务),并将所有逻辑都放在其中,即使是小的部分也是如此,这些部分通常会在领域类中。
我认为很多来自Java/C++世界的程序员会觉得这很丑陋,但它更适合Grails的架构。
是的。服务不会被注入到域对象中。如果您的域对象需要某些东西来处理特定的用例,请让拥有该用例的服务代表域对象调用其他服务。
.getMainContext.
替换为.getMainContext().
,上述代码对我来说才能正常工作。 - sebnukem