【问题标题】:Akka.net message immutabiltyAkka.net 消息不变性
【发布时间】:2018-01-20 06:14:42
【问题描述】:

我一直在研究Akka.net bootcamp,并根据我读到的有关消息的内容遇到了一些令我困惑的事情。

messaging documentation 中声明消息应该是不可变的。

在训练营的第 2 单元中,Initialize Chart 消息似乎在几个层面上是可变的。

public class InitializeChart
{
    public InitializeChart(Dictionary<string, Series> initialSeries)
    {
        InitialSeries = initialSeries;
    }

    public Dictionary<string, Series> InitialSeries { get; private set; }
}

首先,可以修改字典内容(添加、删除等)。其次是字典项目,Series, 是可变的。

我有两个问题:

1) 我对如何构建 Akka.net 消息的解释是否有误? (这个例子其实是对的。)

2) Akka.net 消息是否应该一直不可变?例如,如果此消息更改为:

public class InitializeChart
{
    public InitializeChart(Dictionary<string, Series> initialSeries)
    {
        InitialSeries = new ReadOnlyDictionary<string, Series>(initialSeries);
    }

    public IReadOnlyDictionary<string, Series> InitialSeries { get; private set; }
}

这会满足 Akka.net 消息的要求,还是应该让 Series 元素也是不可变的?

【问题讨论】:

    标签: c# .net immutability actor akka.net


    【解决方案1】:

    是的,该消息应该使用IReadOnlyDictionary 以便不可变。你是对的。元素对象本身也应该包含只读属性。

    【讨论】:

    • 这是一个很好的问题,我一直在为自己苦苦挣扎。我的问题也是......“'系列'对象呢?”。在这里,我们无法控制我们发送的对象(它是 MS 可视化命名空间的一部分)......所以为了满足不可变的要求,我们需要创建一个相同的 Series 对象,它具有它的所有属性和方法设置为“私有”,然后从 MS 系列对象到我们新的只读版本进行费力的复制操作?必须对我们无法控制的许多对象执行此操作……感觉像是很多双重工作。
    • @ProxyTech 更糟糕的情况,您可以启用此 HOCON 设置 github.com/akkadotnet/akka.net/blob/dev/src/core/Akka/… - 这将通过序列化创建每条消息的深层副本。虽然这个设置有点影响性能,但它的主要用途是用于测试。最重要的是,如果您尝试复制的可变对象不可序列化......那么它无济于事:p
    • 感谢您的快速响应。是的,我看到了序列化/深拷贝 HOCON 配置选项……但被 40% 的性能影响推迟了。我想我将不得不创建类的精简不可变版本......真是太痛苦了!
    • 另外,你总是可以在你的消息中包含一个可变对象,并让消费者在修改它之前复制它,但这很危险。如果您的团队中有不熟悉演员的人,他们很有可能会意外地烧毁系统。
    • 也许这是你可以帮助我理解的。如果我创建一条带有可变对象的消息,并将消息从一个参与者发送到另一个参与者......在传输到另一个参与者之前,并非所有消息最终都被序列化(以确保本地/远程参与者的通用传输机制) ......所以他们收到的消息不会本质上是一个新副本,并且与发送参与者的版本没有任何关系吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多