【问题标题】:Guice Assisted Inject with Providers or FactoryModuleBuilder使用提供者或 FactoryModuleBuilder 的 Guice 辅助注入
【发布时间】:2017-02-28 04:23:09
【问题描述】:

这是一个奇怪的用例,我需要一些帮助来弄清楚如何将 Assisted/Providers/FactoryModuleBuilders 相互结合使用。忽略@Singleton 的缺失。这只是一个例子。

属于我无法更改的库的一组特征具有以下模式。它使用蛋糕模式。

trait A { //Has abstract methods and abstract service 'webService' }
trait B extends A { //First Concrete Service Implementation assigned to 'webService' }
trait C extends A { //Second Concrete service Implementation assigned to 'webService' }

由于无法直接注入特征,因此我创建了一个允许注入特征的包装器

BB extends B
CC extends C

在我的代码中,我有一个依赖于服务的控制器,而后者又依赖于库。该服务应该能够根据控制器的需要使用“BB”或“CC”。所以组件如下所示

我将我的服务创建为

//Note: Uses 'trait A' with @Assisted
class SomeWebServiceComponent @Inject()(@Assisted aInstance: A, foo: Foo){
    //Do something with aInstance
}

创建这个的工厂(应该由 Guice 使用 FactoryModuleBuilder 创建)

class SomeServiceFactory {
    def getWebServiceComponent(a:A) SomeWebServiceComponent
}

FactoryModule 看起来像这样

class ApplicationModule extends AbstractModule {
  override def configure() = {
    install(new FactoryModuleBuilder().build(classOf[SomeServiceFactory]))
  }
}

我不介意用我需要的实际类来注释控制器。

class OneController @Inject()(factory: SomeServiceFactory, bb: BB) extends Controller {
    val webServiceComponent = factory.getWebServiceComponent(bb)
}

class AnotherController @Inject()(factory: SomeServiceFactory, cc: CC) extends Controller {
    val webServiceComponent = factory.getWebServiceComponent(cc)
}

使用此设置,我会收到以下类型的错误

No implementation for 'A' annotated with @com.google.inject.assistedinject.Assisted(value=) was bound

我需要了解如何告诉 Guice Trait A 有两种实现方式,即 BB 和 CC,选择将在运行时提供。

有没有办法实现这个用例?

【问题讨论】:

  • FactoryModuleBuilder 是什么样子的?
  • @rethab 用 FactoryModuleBuilder 的用法更新了问题。
  • @rethab 您对 FactoryModuleBuilder 外观的问题促使我也检查了测试基础设置。感谢您和我一起进行鸭子编码:)

标签: scala dependency-injection playframework guice


【解决方案1】:

好的,我创建了一个单独的项目来测试整个场景。 它的工作方式与问题的框架一样。

事实证明,我使用的测试用例当前并未直接使用 GuiceInjection。然而,错误消息与 GuiceInjection 非常相关,以至于我从未调查过测试设置是否正确。

更改测试基地,解决了问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多