如何使用 ZIO具有持久层创建具有“传统”接口的小型库

问题描述

我们希望创建一个具有基于未来界面的“遗留”库:

trait LegacyClient {
   def aMethod(param: Param): Future[Result]
   
   def aSecondMethod(number: Int): Future[String]
}

我们想要创建一个使用 ZIO 但公开“遗留”接口的实现。做的问题

class ZIOBackedLegacyClient extends LegacyClient {
   def aMethod(param: Param): Future[Result] = runtime.unsafeRunToFuture(myImplementedZio)
   
   def aSecondMethod(number: Int): Future[String] = runtime.unsafeRunToFuture(mySecondImplementedZio)
}

该实现的问题是每次都从头开始构建层,而我们希望这些层在两个方法之间共享并具有所属类的生命周期。

你有什么想法吗?

我们还尝试构建一个返回 LegacyClient 的 ZIO,但没有成功,因为层没有共享。

感谢您的帮助!

解决方法

您必须构建自定义运行时:

private val runtime: Runtime.Managed[ZEnv with AppEnv] = Runtime.unsafeFromLayer(finalLayer)

然后在你的 def 方法中使用:

runtime.unsafeRunToFuture(MyZIOModule.zioMethod(param))