scala - 从 ZIO (Scala) 获取 ZManaged 的类型转换
问题描述
我需要帮助将 ZIO[WsConfig, Throwable, A] 类型的值转换为 ZManaged[A] 有下一个代码(我可以在 IDEA 中构建它,没有与类型相关的错误,根本没有),但我有 ??? 就在原地。
def poolCache(implicit tag: Tagged[UcpZLayer.Service]): ZLayer[ZenvLogConfCache_, Throwable, UcpZLayer] = {
val zm: ZIO[WsConfig, Throwable, ZManaged[Any, Throwable, UcpZLayer.Service]] =
for {
conf <- ZIO.environment[WsConfig]
cpool <- Ref.make(new OraConnectionPool(conf.dbconf, conf.ucpconf))
acquire = ZIO(new poolCache(cpool))
release: (UcpZLayer.Service => zio.ZIO[Any,Nothing,Any]) = (pc: UcpZLayer.Service) => pc.closeAll
zm: ZManaged[Any, Throwable, UcpZLayer.Service] = ZManaged.make(acquire)(release)
} yield zm
val managedConnPool: ZManaged[Any, Throwable, UcpZLayer.Service] = ???
ZLayer.fromManaged(managedConnPool)
}
可能会有所帮助-我用来生成 ZLayer 的这种方法 poolCache
object EnvContainer {
type IncConnSrvBind = akka.stream.scaladsl.Source[IncomingConnection, Future[ServerBinding]]
type ZEnvLog = ZEnv with Logging
type ZEnvLogCache = ZEnvLog with CacheManager
type ZenvLogConfCache_ = ZEnvLogCache with config.Config[WsConfig]
type ZEnvConfLogCache = ZEnvLogCache with config.Config[WsConfig] with UcpZLayer
val envLog: ZLayer[Console with Clock, Nothing, Logging] =
Logging.console((_, logEntry) =>
logEntry
)
val ZEnvLogLayer: ZLayer[ZEnv, Nothing, ZEnvLog] = ZEnv.live ++ envLog
val ZEnvLogCacheLayer: ZLayer[ZEnv, Nothing, ZEnvLogCache] =
ZEnv.live ++ envLog ++ CacheManager.refCache
def ZEnvConfLogCacheLayer(confFileName: String): ZLayer[ZEnv, Throwable, ZEnvConfLogCache] = {
val confLayer = configLayer(confFileName)
val combEnvWithoutPool = ZEnv.live ++ envLog ++ confLayer ++ CacheManager.refCache
combEnvWithoutPool ++ (combEnvWithoutPool >>> Ucp.UcpZLayer.poolCache)
}
}
我将任何 ZLayers(带 confLayer)与 ++ 水平组合,并通过 >>> 传递到 poolCache。
解决方案
我建议改为这样做:
def poolCache(implicit tag: Tagged[UcpZLayer.Service]): ZLayer[ZenvLogConfCache_, Throwable, UcpZLayer] =
(for {
// Use a Managed directly when access then environment
// `access` will remove the `Has` wrapping.
conf <- ZManaged.access[Config[WsConfig]](_.get)
// Convert the effect into a no-release managed
cpool <- Ref.make(new OraConnectionPool(conf.dbconf, conf.ucpconf)).toManaged_
// Create the managed
zm <- ZManaged.make(ZIO(new poolCache(cpool)))(_.closeAll)
} yield zm).toLayer // Convert a `Managed` to `ZLayer` directly
推荐阅读
- php - Nginx - Laravel - LEMP - 访问除 / 以外的任何页面时出现 403 Forbidden 错误
- javascript - 如何将整个图像传递给下一个 JS 中的 api 路由,以便我可以用 FS 编写它并用 cloudinary 发送
- javascript - 将最大值存储在变量中的惯用方式?
- kotlin - Kotlin 中的任何泛型
- javascript - 为什么本地存储保存未定义?
- java - 尽管指定了文件扩展名,但上传到 Cloud Storage 的文件类型不正确
- java - jaxb 绑定 name 属性的自定义值
- javascript - Reactjs 不渲染本地图像
- go - 在 hugo 中按类别列出所有页面
- android-studio - 为什么外部共享库没有链接到我的 APK?