我有一些方法的调用链,在这里我通过Kleisli传递上下文。基本上,我想将上下文传递到db访问层,但是我想在两者之间的任何地方访问此上下文。
以下示例非常有效。我的问题是,我也想访问OrderService.findAll(...)
中的上下文。我尝试了几种方法,但一直失败。
object OrderRepository {
fun findAll(userId: String): Kleisli<Context, ForIO, List<Order>> =
Kleisli { ctx ->
IO {
ctx.db.query("someQuery")
}
}
}
object OrderService {
fun findAll(userId: String): Kleisli<Context, ForIO, List<OrderResponse>> =
OrderRepository.findAll(userId).map(IO.monad()) { orderList ->
orderList.map {
//Create OrderResponse from Order
}
}
}
是否可以访问那里的上下文,或者这没有任何意义吗?感谢您的帮助:)
您需要的是从D到D的Kleisli,以D为上下文。这样,您还可以将D(上下文)作为结果类型,并且可以进行flatMap并访问它。这就是为什么ask()提供的方法可以在随播广告中使用的原因。
假设您的OrderRepository
也是Context中的依赖项,而不是纯函数(出于示例目的),因此您需要从服务的上下文中访问它。参见:
class OrderRepository {
fun findAll(userId: String): Kleisli<Context, ForIO, List<Order>> =
Kleisli { ctx ->
IO {
ctx.db.query("someQuery")
}
}
}
object OrderService {
fun findAll(userId: String): Kleisli<Context, ForIO, List<OrderResponse>> {
val monad = IO.monad()
return Kleisli.ask<Context, ForIO>(monad).flatMap(monad) { ctx ->
ctx.repository.findAll(userId).map(monad) { orderList ->
orderList.map { OrderResponse(it) }
}
}
}
}