gpt4 book ai didi

c# - 传递上下文信息

转载 作者:太空宇宙 更新时间:2023-11-03 19:54:17 25 4
gpt4 key购买 nike

我们正在将 akka.net 参与者添加到遗留系统的一部分。

基本思想是消息来自外部系统,它被传递给由 akka.net 参与者管理的逻辑,然后与执行诸如将数据保存到数据库之类的遗留组件对话。

遗留代码依赖于在 CallContext 中设置 userId 的事实,然后它可以在执行数据库写入之前检索它(以存储诸如“CreatedBy”和“LastModifiedBy”之类的内容)。很明显,一旦消息通过参与者系统传递,CallContext 将不可用。

这似乎是一个常见的问题/要求,但我一直无法通过谷歌或浏览 akka/akka.net 讨论组找到这个问题。

akka.net 中是否有上下文包装器/信封的概念,或者我唯一的选择是将上下文信息的传递作为消息的显式部分?

最佳答案

由于您的消息可能会跨 actor 系统边界传递,因此这里最好的选择似乎是包装 CallContext 和要传递的消息,并在消息到达时将其加载到 actor 的字段之一。下面是使用 AroundReceive 方法的示例代码:

public struct Wrapper {
public readonly CallContext CallContext;
public readonly object Message;
...
}

public abstract class ContextualActor : ReceiveActor {
protected CallContext CallContext;
protected override bool AroundReceive(Receive receive, object message) {
if (message is Wrapper) {
var wrapped = (Wrapper)message;
CallContext = wrapped.CallContext;
return base.AroundReceive(receive, wrapped.Message);
}
else return base.AroundReceive(receive, message);
}

public void Send(IActorRef aref, object message) =>
aref.Tell(new Wrapper(CallContext, message))
}

这样,当消息到达 actor 的 receive 方法时,调用上下文就会被加载。请记住,为此,CallContext 必须是可序列化且不可变的,否则它不会安全且无法正常工作。

关于c# - 传递上下文信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35510695/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com