我们所有的后端服务都是用Scala编写的。我们主要使用Cats编写纯函数Scala。
我试图弄清楚Cats或Scala中是否有一个设计模式,我可以用来设计一个EventLogger。
此eventLogger应收集"事件" (简单的键值)当请求流过逻辑时。在请求结束时,我想将收集的事件写入数据存储。我们已经有了一个" context"传递给所有方法的隐式参数。我可以将这个EventLogger添加到我的Context类中,它可以从我的代码的大部分内容访问事件记录器。现在我试图弄清楚如何设计eventLogger本身,而不使用可变集合。
我已经习惯了akka演员过去收集状态来管理变异状态。我不想仅为此将Akka引入我们的类路径中。
答案 0 :(得分:1)
正如@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)
在此结束时,您将获得某种Writer[Vector[Event], ?]
值,其中?
可能是您感兴趣的值,Vector[Event]
就是您的全部Event log
{1}}数据已准备就绪,您可以使用。
通常Writer
也不是您想要使用的唯一容器。您可能希望调查Monad Transformers以堆叠容器或类似Eff。