c# - 传递上下文信息

标签 c# akka akka.net

我们正在将 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/

相关文章:

c# - 在 C# 中通过 Console.Readline() 访问全局变量

c# - 在 C# 应用程序中使用 LinkedIn API

c# - Akka 网络集成测试

c# - 不可收集的程序集不能引用可收集的程序集

c# - GetGenericTypeDefinition 返回不同的类型

java - 参与序列过程的 Akka Actor 的饥饿

akka - 从 akka 路由器检测远程节点的故障

java - Akka Typed actor in play websocket

c# - Akka.net - 尝试测试重复的预定消息

akka.net - 如何为 akka.net 启用消息持久性