Scala Cats Effect 从封闭类的 Effect 类型包装实现

问题描述 投票:0回答:1

我有一个如下所示的实现:

final class MyServiceImpl[M[_]: Async](dbCfg: DBConfig)(implicit ec: Scheduler) extends MyService[M] {
  ......
  ......
  ......
  ......
}

在这个类中,我有一些使用 doobie 对数据库运行 sql 查询的方法。当我测试它们时,我觉得需要记录这些查询,doobie 有一个很好的方法来完成这个任务,那就是实现特征

LogHandler[M[_]]

然后我可以将其放入 MyServiceImpl 中,就像 doobie 文档中所述:

val printSqlLogHandler: LogHandler[IO] = new LogHandler[IO] {
  def run(logEvent: LogEvent): IO[Unit] = 
    IO { 
      println(logEvent.sql)
    }
}

该示例使用 IO,但我更喜欢使用 MyServiceImpl 实例化的效果类型。我该怎么做?

scala generics scala-cats doobie
1个回答
0
投票

首先创建类如下:

trait MyLogHandler[M[_]] {
  def log(logEvent: LogEvent): M[Unit]
}

其次对你的班级造成的影响:

class MyCustomLogHandler[M[_]: Async] extends LogHandler[M] with MyLogHandler[M] {
  def log(logEvent: LogEvent): M[Unit] =
    Async[M].delay {
      println(logEvent.sql)
    }
}

最后你可以像下面这样使用它:

final class MyServiceImpl[M[_]: Async](dbCfg: DBConfig)(implicit ec: Scheduler) extends MyService[M] {

  val logHandler: LogHandler[M] = new MyCustomLogHandler[M]

  // ...
}
© www.soinside.com 2019 - 2024. All rights reserved.