【问题标题】:Injecting different services in Grails在 Grails 中注入不同的服务
【发布时间】:2014-02-28 21:52:09
【问题描述】:

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

例如

MyAService implements MyInterface {
...
}

MyBService implements MyInterface {
...
}

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

【问题讨论】:

    标签: grails dependency-injection


    【解决方案1】:

    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,您可能不需要该接口,但它不会造成伤害,并且可以为您提供一点编译时安全性。

    【讨论】:

    • 不错。但是只是说我有很多像 theDestinationBean 这样的类如何扩展?
    • 一种选择是添加 def grailsApplication 并手动从 ApplicationContext 检索 bean,例如def otherDest = grailsApplication.mainContext.getBean('&lt;bean name&gt;')。您可以定义 bean 名称并根据需要循环应用逻辑。 Spring 有一个InitializingBean 接口和一个afterPropertiesSet 方法,一旦设置了所有deps,您就可以使用它来完成工作。你不能在这里使用它,因为你是在 Spring 之后工作的,但是你可以创建一个类似的接口(或者只是一个方法调用的约定)并在你完成后调用它。
    【解决方案2】:

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

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

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

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

    • 使用resources.groovy 以正确实现来填充服务
    • 或者让我的服务从InitializingBean接口实现afterPropertiesSet

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-31
      • 2016-02-22
      • 1970-01-01
      相关资源
      最近更新 更多