2010-05-11 72 views
5

我需要基于域的属性注入服务,到目前为止,我想出了以下内容:的Grails:动态域类注射服务

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

,但这种方式装填不注它的相关服务。我做错了吗?

回答

15

新实例将绕过Spring的依赖管理;您需要从应用程序上下文获取配置的单例bean。使用这个来代替:

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

这假定“财产”是一种服务,即对于FooBarService部分bean的名字,属性必须是“Foobar的”。如果是“fooBar”的,那么你可以使用GrailsNameUtils.getPropertyName()来解决这个问题:

import grails.util.GrailsNameUtils 

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

耶,它的工作原理。我尝试了getBean方法,但是传递了'FooBar':) :) – rukoche 2010-05-12 10:25:07

+0

上面的代码在我用'.getMainContext()替换'.getMainContext.'时并不适用于我。' – sebnukem 2013-05-21 15:33:53

+0

谢谢,我在看到你的代码后修复了它编辑被错误地拒绝 – 2015-04-15 05:45:16

0

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

+2

任何Spring bean都可以像控制器一样注入到域类中,即“def fooService”。常见的用例是在自定义验证器中调用服务。 – 2010-05-11 20:44:11

+0

可以;我只是不同意它应该是。验证程序与帐户或人员等域对象不同。这是一个完全不同的用例。 – duffymo 2010-05-11 20:52:57

3

恕我直言域类不应该包含所有的逻辑(除了形成的验证)。

在我的项目我通常创建为每个域类(例如UserService类用户)服务和我粘在那里所有的逻辑,即使是小位件通常会处于域类。

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

+3

的确,Grails领域类并不真的适合逻辑,但这是一个耻辱,因为我必须同意Fowler的这一点:http://en.wikipedia.org/wiki/Anemic_Domain_Model – Kimble 2010-09-22 13:06:11

+1

确实,埃里克埃文斯可能会感觉到一股力量的混乱,当时有人说“领域类别不应该包含任何逻辑”。这听起来像是一个Domain对象的反模式,完全与Domain驱动的设计相反。 – 2011-04-13 19:40:12

+0

在我的情况下,我想设置一个基于grails环境的索引TTL。什么是更好的模式呢? – Kirby 2016-03-18 14:33:24