在Grails中注入不同的服务

在Grails中注入不同的服务,grails,dependency-injection,Grails,Dependency Injection,有没有可能让两个服务实现同一个接口,并在运行时决定为Grails中的接口注入什么服务 比如说 MyAService implements MyInterface { ... } MyBService implements MyInterface { ... } 其他服务只需引用MyInterface,您就可以根据配置设置或任何要注入的服务来决定了?Grails使用按名称自动注入来进行基于约定的注入,如def fooService,服务等工件在启动时自动注册。如果您在resources.gro

有没有可能让两个服务实现同一个接口,并在运行时决定为Grails中的接口注入什么服务

比如说

MyAService implements MyInterface {
...
}

MyBService implements MyInterface {
...
}

其他服务只需引用MyInterface,您就可以根据配置设置或任何要注入的服务来决定了?

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

但我会保持简单,并在
BootStrap.groovy
中进行工作。在目标类中添加一个公共字段(例如
def myService
)或一个私有字段和一个setter(例如
void setMyService(service){this.myService=service}

class BootStrap {

   def myAService
   def myBService
   def theDestinationBean

   def init = { servletContext ->
      if (<some condition>) {
         theDestinationBean.myService = myAService
      }
      else {
         theDestinationBean.myService = myBService
      }
   }
}
类引导{
def myAService
def myBService
def theDestinationBean
def init={servletContext->
如果(){
DestinationBean.myService=myAService
}
否则{
theDestinationBean.myService=myBService
}
}
}

由于它是Groovy,您可能不需要该接口,但它不会造成伤害,并且可以给您一点编译时安全性。

在我的项目中,我使用了
资源。Groovy

if(myconf == "A") {
  myInterfaceService = ref('myAService')
} else {
  myInterfaceService = ref('myBService')
}
但我认为这是一种不好的做法,因为
myAService
myBService
都是实例化的,即使只有一个真正被使用

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

  • 使用
    resources.groovy
    以正确的实现填充服务
  • 或者让我的服务从
    初始化bean
    接口实现
    AfterPropertieSet

不错。但我有很多类,比如DestinationBean,它是如何扩展的?一个选项是添加
def grailsApplication
并手动从ApplicationContext检索Bean,例如
def otherDest=grailsApplication.mainContext.getBean(“”)
。您可以定义bean名称并根据需要应用逻辑对其进行循环。Spring有一个
初始化bean
接口,该接口带有一个
afterPropertiesSet
方法,您可以在设置完所有DEP后使用该方法进行工作。您不能在此处使用该方法,因为您在Spring完成其任务后进行工作,但您可以创建一个类似的ar接口(或者只是调用方法的约定)并在完成后调用它。