我需要帮助将 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。