如何使用Kleisli在调用链的每个函数中访问上下文?

破码

我有一些方法的调用链,在这里我通过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中的依赖项,而不是纯函数(出于示例目的),因此您需要在服务的上下文中访问它。看到:

interface OrderApi
interface OrderDB {
  fun query(query: String): List<Order> = TODO()
}

data class Order(val id: String)
data class OrderResponse(val order: Order)
data class Context(val api: OrderApi, val repository: OrderRepository, val db: OrderDB)

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) }
      }
    }
  }
}

就是说,Kleisli是Monad的转换器(也称为ReaderT),使用起来有些麻烦。如果您想在功能代码库上注入依赖关系并保持简单,我的建议是在Context接收器上使用扩展功能,该接收器已经隐式地将您的依赖关系传递给了各个级别,这在Paco的这篇文章中已有介绍

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何访问上下文消费者中的道具

来自分类Dev

从中访问上下文

来自分类Dev

函数如何访问类的上下文

来自分类Dev

vue + nuxt js-如何在服务器端的插件中访问上下文?

来自分类Dev

可以访问上下文的Jinja扩展

来自分类Dev

ReactJS:从基本组件访问上下文

来自分类Dev

每次Entity Framework数据库迁移后如何访问上下文

来自分类Dev

在Autofac中的lambda注册期间访问上下文信息?

来自分类Dev

在Javascript HTML中的Django视图中访问上下文变量(列表)

来自分类Dev

我无法在react.createContext()中访问上下文的功能

来自分类Dev

在Autofac中的lambda注册期间访问上下文信息?

来自分类Dev

如何从传递给实例调用的“ bind”方法的预定义函数中访问对象实例的上下文?

来自分类Dev

使用“this”调用片段中的上下文

来自分类Dev

JavaScript如何确定何时给函数调用“ this”上下文?

来自分类Dev

如何获取调用静态函数的活动的上下文?

来自分类Dev

如何在不访问上下文的情况下从线程更新我的Android SQLite数据库?

来自分类Dev

每次全局更改时如何访问上下文状态的一部分而不渲染?

来自分类Dev

通过在异步gridview中单击图像来防止访问上下文操作菜单时重新加载活动

来自分类Dev

如何从Vue Composition API / Vue 3.0 + TypeScript中的组合函数访问根上下文?

来自分类Dev

如何在回调函数中访问“this”的两个上下文?

来自分类Dev

如何在Moose构造函数中确定在哪个上下文中调用它?

来自分类Dev

我该如何从外部在flutter中从外部调用需要上下文的函数

来自分类Dev

是否可以在上下文管理器的__exit __()方法内访问上下文对象(代码块)?

来自分类Dev

如何在Meteor中访问选项的上下文?

来自分类Dev

如何在React中访问画布上下文

来自分类Dev

如何从插件内部访问查询中给定的上下文?

来自分类Dev

jQuery上下文调用函数

来自分类Dev

如何使用Spark上下文访问Web URL

来自分类Dev

如何访问在Java中的.class对象而不使用类名从静态上下文

Related 相关文章

  1. 1

    如何访问上下文消费者中的道具

  2. 2

    从中访问上下文

  3. 3

    函数如何访问类的上下文

  4. 4

    vue + nuxt js-如何在服务器端的插件中访问上下文?

  5. 5

    可以访问上下文的Jinja扩展

  6. 6

    ReactJS:从基本组件访问上下文

  7. 7

    每次Entity Framework数据库迁移后如何访问上下文

  8. 8

    在Autofac中的lambda注册期间访问上下文信息?

  9. 9

    在Javascript HTML中的Django视图中访问上下文变量(列表)

  10. 10

    我无法在react.createContext()中访问上下文的功能

  11. 11

    在Autofac中的lambda注册期间访问上下文信息?

  12. 12

    如何从传递给实例调用的“ bind”方法的预定义函数中访问对象实例的上下文?

  13. 13

    使用“this”调用片段中的上下文

  14. 14

    JavaScript如何确定何时给函数调用“ this”上下文?

  15. 15

    如何获取调用静态函数的活动的上下文?

  16. 16

    如何在不访问上下文的情况下从线程更新我的Android SQLite数据库?

  17. 17

    每次全局更改时如何访问上下文状态的一部分而不渲染?

  18. 18

    通过在异步gridview中单击图像来防止访问上下文操作菜单时重新加载活动

  19. 19

    如何从Vue Composition API / Vue 3.0 + TypeScript中的组合函数访问根上下文?

  20. 20

    如何在回调函数中访问“this”的两个上下文?

  21. 21

    如何在Moose构造函数中确定在哪个上下文中调用它?

  22. 22

    我该如何从外部在flutter中从外部调用需要上下文的函数

  23. 23

    是否可以在上下文管理器的__exit __()方法内访问上下文对象(代码块)?

  24. 24

    如何在Meteor中访问选项的上下文?

  25. 25

    如何在React中访问画布上下文

  26. 26

    如何从插件内部访问查询中给定的上下文?

  27. 27

    jQuery上下文调用函数

  28. 28

    如何使用Spark上下文访问Web URL

  29. 29

    如何访问在Java中的.class对象而不使用类名从静态上下文

热门标签

归档