2011-10-29 47 views
2

假设我有10个grails服务。这些服务中的每一个都将拨打REST服务。所以,我想封装REST代码,以便它可以轻松地被10个服务所使用。grails服务层次结构

在考虑的选择,我可以:

1)创建REST相关的代码,其他服务或豆,并注入它的10所服务的每一个。
2)创建一个包含REST代码的超类服务,并且所有10个grails服务扩展这个类。

我试着去选择2,但遇到依赖注入到超类的问题。

实施例:

class SuperService { 
    def aString 
} 

class ExampleService extends SuperService { 
} 

resources.groovy:

beans = { 
    superService(SuperService) { 
     aString = "something" 
    } 
    exampleService(ExampleService) { 
    } 
} 

当我在调试器中运行此运行的集成测试,同时,我看到ASTRING的值为空。显然,这对我来说会有问题。

正如你所预料的,具有以下resources.groovy运行相同的代码:

beans = { 
    superService(SuperService) { 
    } 
    exampleService(ExampleService) { 
     aString = "something" 
    } 
} 

和ASTRING = “东西”。

所以,我更喜欢选项2,因为它会少配置接线,但我不认为这将是可行的方法。换句话说,如果必须在每个子类中设置一个字符串,就没有价值。

的思考?

我错过了什么吗?

我对其他选项也是开放的。

由于提前, 托德

+0

为什么你认为选项2会少配置接线? –

回答

0

您有选项#2正确的观念在被DRY方面 - 但它实际上只是一条线。如果唯一与superService对象相同的是服务,并且没有其他方法,那么你实际上并没有保存任何工作。如果有的话,只要声明一个依赖注入的超类就会让事情更加隐藏,并且可能更难以维护。

听起来像你建议把REST方法放在superService中,所以不确定为什么你关心依赖注入到superService中 - 你希望你的方法执行REST交互,而子类将会是能够打电话。或者你是否尝试了选项1和2的组合?

+0

在superService中,我需要访问springSecurityService或Spring Security插件提供的util或holder对象之一。在进行其他呼叫之前,这个superSerivce需要知道谁登录了。在星期五,我无法获得这个超级服务来检索任何东西......总是使用安全的NPE。我认为我的问题是依赖注入。 –

+0

今天早上,下面的代码在superClass中工作:def ctx = AH.application.mainContext SpringSecurityService springSecurityService = ctx.springSecurityService def loggedInUser = springSecurityService。getPrincipal() –

+0

有趣。我仍然感到惊讶的注射没有工作到superService。你在使用Grails 2.0.RC1吗?还是1.3.7? – Todd