我有一个如下所示的实现:
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 实例化的效果类型。我该怎么做?
首先创建类如下:
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]
// ...
}