मुझे 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
शायद आप ZManaged.fromEffect चाहते हैं? dcoumentation< पर एक नज़र डालें /b>
 – 
Luis Miguel Mejía Suárez
23 अप्रैल 2020, 00:50

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