当前位置: 首页 > 知识库问答 >
问题:

使用提供程序或FactoryModuleBuilder的Guice辅助注入

阎单鹗
2023-03-14

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

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

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特性A有两种实现,即BB和CC,并且在运行时提供选择。

有办法实现这个用例吗?

共有1个答案

滕英奕
2023-03-14

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

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

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

 类似资料:
  • 我是一名guice新手,试图弄清楚如何使用FactoryModuleBuilder在guice中实现辅助注入。我参考了guice java文档来实现FactoryModuleBuilder。 我所做的一切都完全按照文件中所说的那样。这不是注射工厂。我提到了这个堆栈溢出问题:Guice AssistedInject不会注入具有相同问题的工厂。它讨论了构造函数注入之前的字段注入问题。我遵循了它,并尝试

  • 我正在使用Guice Assisted Inject库为我建立一个工厂。我目前的设置如下: 这迫使我使用< code > factory . create controller(first,factory . create second(first))显式创建一个< code>SecondDep。是否可以更改我的绑定,这样我就可以简单地执行< code > factory . create con

  • 目前,我将辅助注射与命名参数一起使用,如下所示: 这很棒。但是我认为使用字符串作为参数的标识符有点难看。我想做的是以下内容: 所以本质上我想要自定义辅助注释。有办法做到这一点吗?

  • 我已经使用google-guice和辅助注射机制有一段时间了。因为我在scala,刚刚发现scala-guice,我也对使用它感兴趣。但是我对如何使用辅助注射感到困惑。没有使用辅助注射的例子。 因此,我的问题是:是否可以使用scala guice辅助注射,如果可以,请提供一个简单的例子? 此外,对于google-guice,我使用以下库:javax.inject.jar、guice-3.0.jar

  • 我的应用程序中有两个绑定类型的命名实例: 我有一个类,希望每个类使用一个实例。由于技术原因,此类不能直接注入实例,它必须向实例注入提供程序: 问题是,上面的FooPrime注入不是注入名为“prime”的实例,而是注入名为“prime”的提供者,这当然不是我想要的。 如何让Guice为名为“prime”的Foo实例注入一个提供程序?

  • 我有一个工厂是这样的: 这样的类: 如何正确使用Google Guice来做同样的事情?我尝试了辅助注射,但我不确定如何创建“UrlBuilder”。谁能帮忙?