在Grails中注入不同的服务

时间:2014-02-28 21:52:10

标签: grails dependency-injection

是否有可能让两个服务实现相同的接口并在运行时决定为Grails中的接口注入哪些服务?

例如

MyAService implements MyInterface {
...
}

MyBService implements MyInterface {
...
}

其他服务只是引用了MyInterface,您可以根据配置设置或注入什么服务来决定?

2 个答案:

答案 0 :(得分:6)

Grails使用自动注入按名称进行基于约定的注入,如def fooService,并且服务等工件在启动时自动注册。如果在resources.groovy中配置bean及其依赖项,则可以更好地控制,并且可以使用Groovy代码来应用逻辑。

但是我会保持简单并在BootStrap.groovy中完成工作。在目标类中添加一个公共字段(例如def myService)或私有字段和一个setter(例如void setMyService(service) { this.myService = service }。然后在BootStrap中,依赖注入所有可能的候选项并手动注入正确的候选项。像

这样的东西
class BootStrap {

   def myAService
   def myBService
   def theDestinationBean

   def init = { servletContext ->
      if (<some condition>) {
         theDestinationBean.myService = myAService
      }
      else {
         theDestinationBean.myService = myBService
      }
   }
}

因为它是Groovy,你可能不需要接口,但它不会受到伤害,并且可以为你提供一点编译时的安全性。

答案 1 :(得分:2)

在我的项目中,我使用resources.groovy

if(myconf == "A") {
  myInterfaceService = ref('myAService')
} else {
  myInterfaceService = ref('myBService')
}

但我认为这是一种不好的做法,因为myAServicemyBService都是实例化的,即使只使用了一个。

我宁愿只有一个服务作为grails服务,不同的实现将位于src目录中,然后是:

  • 使用resources.groovy填写正确实施的服务
  • 或从afterPropertiesSet界面
  • 使我的服务实现InitializingBean