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

Scala Guice传递参数中的依赖注入

邓昀
2023-03-14

我有一个非常简单的场景可以使用 DI 解决,但我无法找到合适的示例/文档来帮助我完成。我是Scala/Guice世界的新手。

当前组件看起来像这样

trait Foo {
}

class FooImpl extends A {

}

trait Bar {
   val description: String
}

class BarImpl(val description: String) extends Bar {

}

现在,我在Foo和Bar之间有一个依赖项。所以,通常代码看起来像这样

class FooImpl extends Foo {
  Bar bar = createBar("Random Bar Value!")
}

其中createBar("Bar!")只是返回new BarImpl("随机条形图值")。当然,为了简洁起见,我删除了工厂/助手。

我意识到,当我使用“new”时,这已经脱离了DI范式。我希望确保可以基于参数将Bar注入FooImpl。有点像使用工厂。我们如何在Scala/Guice世界中使用DI。

我看了一下AssistedInjection/Named Parameters,但我无法理解用法最终会是什么样子。我认为这是最好的方法,但无法理解应该如何编写/测试它。

共有1个答案

侯池暝
2023-03-14

好吧,这就是我最后的工作。为任何想处理基于Scala的辅助注入的人重写这些步骤。

Foo可能需要Bar,但真正需要注入的是BarFactory,而不是Bar。

需要创建一个BarFactory,但是实现可以留给Guice。这就是棘手的地方。

trait BarFactory {
  def create(msg:String):Bar
}

因此,让我们重新审视Foo和Bar:

@ImplementedBy(classOf[FooImpl])
trait Foo {
  def getBar(msg: String): Bar
}

class FooImpl @Inject() (barFactory: BarFactory) extends Foo {
  override def getBar(msg: String): Bar = {
    barFactory.create(msg)
  }
}

@ImplementedBy(classOf[BarImpl])
trait Bar {
  def echo() : String
}

//Note that we use the @Assisted Annotation Here.
class BarImpl @Inject() (@Assisted msg: String) extends Bar {
  override def echo(): String = msg
}

创建实际工厂是作为模块的一部分完成的

class TempModule extends AbstractModule {
  override def configure(): Unit = {
    install(new FactoryModuleBuilder()
      .implement(classOf[Bar], classOf[BarImpl])
      .build(classOf[BarFactory]))
  }
}

一旦开始,工厂实现将由Guice提供,您应该能够使用工厂创建自己的实际实现。

 类似资料:
  • 在应用中,您希望使用不同的类来处理不同的任务以保持代码的简洁。我们把这些类称为 依赖。如何将这些依赖关系传递给将在后台任务调用的方法呢? 当您在后台任务中调用静态方法时,仅限于应用程序的静态上下文,这需要您使用以下获取依赖关系的模式: 通过 new 手动实例化依赖 服务定位器模式 抽象工厂模式 或 建设者模式 单例模式 然而,所有这些模式使您的应用程序的单元可测试性方面变得非常复杂。为了解决这个问

  • 本文向大家介绍DBMS中的传递依赖,包括了DBMS中的传递依赖的使用技巧和注意事项,需要的朋友参考一下 什么是传递依存关系 当间接关系引起功能依赖性时,称为传递依赖性。 如果P-> Q且Q-> R为真,则P-> R为传递依赖。 要实现3NF,请消除传递依赖性。 示例 <电影列表> Movie_ID Listing_ID Listing_Type DVD_价格($) M08 L09 犯罪 180 M

  • 主要内容:依赖传递,依赖范围,依赖范围对传递依赖的影响,依赖调节Maven 依赖传递是 Maven 的核心机制之一,它能够一定程度上简化 Maven 的依赖配置。本节我们将详细介绍依赖传递及其相关概念。 依赖传递 如下图所示,项目 A 依赖于项目 B,B 又依赖于项目 C,此时 B 是 A 的直接依赖,C 是 A 的间接依赖。 Maven 的依赖传递机制是指:不管 Maven 项目存在多少间接依赖,POM 中都只需要定义其直接依赖,不必定义任何间接依赖,Mav

  • 问题内容: 我正在处理一个表,该表具有一个复合主键,该主键由1NF形式的两个属性(总共10个)组成。 在我的情况下,全功能的依赖项涉及依赖项, 这 依赖于我的主键中的 两个 属性。 部分依赖项依赖于主键中的任一属性。 传递依赖关系涉及功能依赖关系中的两个或多个非关键属性,其中一个非关键属性依赖于我的主键中的某个关键属性。 将可传递的依赖关系从表中拉出,似乎 在 规范化 之后 执行了此操作,但是我的

  • 我正在从一个使用Android-Maven-Plugin的Maven项目中构建一个Android应用程序。在这个项目中,我使用了新的beta版数据绑定库。 它包含在Android SDK的本地m2repository中(extras/Android/m2repository)。这个存储库中的库打包为AAR类型。 附注:对于我自己的本地构建,我有几个解决方案(例如重新打包为jar),但我更喜欢一个更

  • 我试图在注释中创建一些信息树结构。经过一些尝试和帮助(请参阅java注释中的类型层次结构),我转向了以下模型。 该节点应允许我定义一级条件树。LogicalPression中的值定义子节点(属性和其他节点)之间的关系。问题是注释不允许递归依赖: 即使我在Node和NodeList包含节点列表中添加了一些NodeList注释,循环依赖也会再次被识别。 循环注释定义有什么解决方案吗?