scala ZLayer.scoped和ZLayer.fromZio有什么区别?

xxb16uws  于 6个月前  发布在  Scala
关注(0)|答案(1)|浏览(62)

我被ZIO中许多不同的方式所迷惑,这些方式似乎是同一件事(至少在我看来是这样)。
特别是,像这样的东西:

val layer: RLayer[ServiceA with ServiceB, ServiceC] = ZLayer.scoped {
  for {
     a <- ZIO.service[ServiceA]
     b <- ZIO.service[ServiceB]
  } yield new ServiceCImpl(a, b)
}

字符串
vs

val layer2: RLayer[ServiceA with ServiceB, ServiceC] = ZLayer.fromZIO {
  for {
     a <- ZIO.service[ServiceA]
     b <- ZIO.service[ServiceB]
  } yield new ServiceCImpl(a, b)
}


这两个代码段做的是同一件事吗?如果不是,有什么区别?如果是,为什么有两个?什么时候你会使用一个而不是另一个?

2guxujil

2guxujil1#

在你的例子中,他们也在做同样的事情。实际上,ZLayer.fromFunction还有第三种方法:

ZLayer.fromFunction(ServiceCImpl _)
// or:
ZLayer.fromFunction((a: ServiceA, b: ServiceB) => new ServiceCImpl(a,b))

字符串
这是最简单的。
那又有什么区别呢?

  • ZLayer.scoped用于您正在创建的服务需要某些限定范围的资源(如打开一个文件并在“停止”服务时自动关闭该文件,或数据库连接)时
  • 当没有要管理的资源但仍存在潜在错误时,使用ZLayer.fromZIO,并且创建服务时表示为ZIO
  • 当上述任何一项都不适用时,即创建服务时只需要一些其他依赖项,但它不会失败,并且不需要管理任何资源时,将使用ZLayer.fromFunction

另请参阅ZLayer reference documentation

相关问题