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

Posted

技术标签:

【中文标题】如何使用 ZIO(具有持久层)创建具有“传统”接口的小型库【英文标题】:How to create a small library with a "legacy" interface using ZIO (having persistent layers) 【发布时间】:2021-07-03 05:14:04 【问题描述】:

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

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,因为这些层没有共享。

感谢您的帮助!

【问题讨论】:

【参考方案1】:

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

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

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

runtime.unsafeRunToFuture(MyZIOModule.zioMethod(param))

【讨论】:

以上是关于如何使用 ZIO(具有持久层)创建具有“传统”接口的小型库的主要内容,如果未能解决你的问题,请参考以下文章

如何在具有并发控制的 .NET 和 EF 应用程序中设计持久层?

MyBatis-03-笔记

如何在 C++ 中实现强大的数据持久层?

使用 Azure 服务的具有身份验证、授权和持久层的 Xamarin 应用程序

架构:Spring hibernate 应用程序在一台服务器上具有 Web 界面,在不同服务器上具有持久层

MappingException:在具有流畅映射的 N 层应用程序中没有持久性