Scala中的事件记录器模式
我们所有的后端服务都是用Scala编写的。我们主要使用Cats编写纯函数Scala 我正试图弄清楚在Cats或Scala中是否有一种设计模式,可以用来设计事件记录器 当请求流经逻辑时,此事件记录器应收集“事件”(简单键值)。在请求结束时,我想将收集到的事件写入数据存储。我们已经有了一个“context”隐式参数,可以传递给所有方法。我可以将这个EventLogger添加到我的上下文类中,它可以从我代码的大部分部分访问事件记录器。现在,我试图弄清楚如何设计eventLogger本身,而不使用可变集合Scala中的事件记录器模式,scala,scala-cats,Scala,Scala Cats,我们所有的后端服务都是用Scala编写的。我们主要使用Cats编写纯函数Scala 我正试图弄清楚在Cats或Scala中是否有一种设计模式,可以用来设计事件记录器 当请求流经逻辑时,此事件记录器应收集“事件”(简单键值)。在请求结束时,我想将收集到的事件写入数据存储。我们已经有了一个“context”隐式参数,可以传递给所有方法。我可以将这个EventLogger添加到我的上下文类中,它可以从我代码的大部分部分访问事件记录器。现在,我试图弄清楚如何设计eventLogger本身,而不使用可变集
过去,我习惯于akka参与者收集状态以管理突变状态。我不希望仅仅为了这个而将Akka引入我们的类路径。正如@AndreyTyukin所建议的那样,
Writer
在这里可以很好地工作
你可以这样做:
object EventLogger {
type Event = (String, String)
def log(event: Event): Writer[Vector[Event], Unit] =
Writer.tell(Vector(event))
}
然后你可以这样使用它:
// Example usage
for {
something <- Writer.value(myFunc(arg))
_ <- EventLogger.log("function_finished" -> "myFunc")
somethingElse <- Writer.value(myFunc2(arg2))
_ <- EventLogger.log("function_finished" -> "myFunc2")
} yield combine(something, somethingElse)
//示例用法
为了{
为什么不使用WriterT
?