Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在没有Play框架的情况下,如何在Scala中使用依赖项注入?_Scala_Dependency Injection - Fatal编程技术网

在没有Play框架的情况下,如何在Scala中使用依赖项注入?

在没有Play框架的情况下,如何在Scala中使用依赖项注入?,scala,dependency-injection,Scala,Dependency Injection,我有使用Scala和Play开发基于web的应用程序的经验。Play支持Guice开箱即用,因此使用Play进行DI非常容易 我目前正在处理一个Scala项目,它不是web应用程序,也不使用Play。我想动态地将config对象注入到一些地方。我该怎么做 如果需要使用一些库来进行DI,那么哪个库适合此目的?有样本代码吗?是否可以在不使用任何外部库的情况下使用纯Scala实现这一点?当我在没有播放的情况下搜索Scala DI时,所有结果都是播放的 提前谢谢 我不太确定,但我认为您仍然可以使用 co

我有使用Scala和Play开发基于web的应用程序的经验。Play支持Guice开箱即用,因此使用Play进行DI非常容易

我目前正在处理一个Scala项目,它不是web应用程序,也不使用Play。我想动态地将config对象注入到一些地方。我该怎么做

如果需要使用一些库来进行DI,那么哪个库适合此目的?有样本代码吗?是否可以在不使用任何外部库的情况下使用纯Scala实现这一点?当我在没有播放的情况下搜索Scala DI时,所有结果都是播放的


提前谢谢

我不太确定,但我认为您仍然可以使用

com.google.inject%guice%4.2.2

并实现类似的功能

class Module extends com.google.inject.AbstractModule {
  protected def configure() = {
    // Example Usage:
    bind(classOf[ClassNameToInjected]).asEagerSingleton()
  }
}

希望能有所帮助。

游戏与依赖注入无关。它由广泛使用的JavaDI库处理

为了掌握Guice的主要概念,我建议您阅读。

我喜欢使用

设置

将此行添加到build.sbt文件:

然后重新加载。 注意,提供了作用域,因此不会增加任何运行时开销。它使用宏在编译时完成它的工作。这意味着您将获得一个编译时依赖项注入,如果您缺少一个依赖项,那么您将尽快找到它,并出现编译时错误,而不是运行时异常

代码示例

让我们定义两个服务,X和Y,以及一些依赖项A、B和C,以便以后使用它们: 案例类别A B类案件 案例C类 案例类别Xa:A、b:b 案件类别Yc:C 现在,让我们在世界尽头的主函数附近连接我们的依赖项: 导入com.softwaremill.macwire_ 延迟值a=导线[a] 延迟值b=导线[b] 延迟值c=导线[c] 延迟值x=导线[x] 延迟值y=导线[y] 编译器将上述代码转换为以下代码: 懒惰的val a=新的a 延迟值b=新值b lazy val c=新c 延迟值x=新的Xa,b lazy val y=新的Yc 正如您在文章中所问的,这基本上是用普通Scala代码实现的

更改依赖项

这里有一件好事,当其中一个服务通过添加/删除依赖项进行更改时,您的连接代码将保持不变。 例如,让我们将服务Y更改为也需要B作为依赖项

我们的服务和依赖项如下所示: 案例类别A B类案件 案例C类 案例类别Xa:A、b:b 案例类别Yb:B,c:c 接线代码将保持不变

编译器将接线代码转换为:

懒惰的val a=新的a 延迟值b=新值b lazy val c=新c 延迟值x=新的Xa,b lazy val y=新的Yb,c
libraryDependencies += "com.softwaremill.macwire" %% "macros" % "2.3.2" % Provided