मुझे ZIO [WsConfig, थ्रोएबल, ए] प्रकार के मूल्य को ZManaged [A] में बदलने में मदद चाहिए, अगला कोड है (मैं इसे आईडीईए में बना सकता हूं, प्रकारों से संबंधित कोई त्रुटि नहीं, कोई भी नहीं), लेकिन मेरे पास है ??? बस जगह पर।
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 का उत्पादन करने के लिए उपयोग करता हूं
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 के साथ) को क्षैतिज रूप से ++ के साथ जोड़ता हूं और पूल कैश में >>> के साथ पास करता हूं।
-1
Aleksey N Yakushev
23 अप्रैल 2020, 00:23
1 उत्तर
पॉलपडेनियल
बहुत बहुत धन्यवाद। जब मैं आपके सुझाव का प्रत्यक्ष उपयोग करने का प्रयास करता हूं, तो यह प्रकार की त्रुटि उत्पन्न करता है:
Required: zio.ZLayer[ZenvLogConfCache_, Throwable, zio.Has[Service]]
Found: zio.ZLayer[R with Config[WsConfig], Throwable, zio.Has[poolCache]]
मैं इसे अगले रूप में फिर से लिखता हूं
def poolCache(implicit tag: Tagged[UcpZLayer.Service]): ZLayer[ZenvLogConfCache_, Throwable, Has[UcpZLayer.Service]] = {
val zm: ZManaged[Config[WsConfig], Throwable, poolCache] =
for {
// Use a Managed directly when access then environment
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
zm.toLayer // Convert a `Managed` to `ZLayer` directly
}
अब मैं बिना किसी त्रुटि के निर्माण कर सकता हूं। एक बार फिर धन्यवाद।
0
Aleksey N Yakushev
23 अप्रैल 2020, 09:52
एन याकुशेव अच्छी बात है, मुझे
– Has
को access
से खोलना चाहिए था। मैंने अपना उत्तर अभी अपडेट किया है ताकि भविष्य के पाठकों को कोई भ्रम न हो।
paulpdaniels
24 अप्रैल 2020, 06:02
ZManaged.fromEffect
चाहते हैं? dcoumentation< पर एक नज़र डालें /b>