如何在不重复对每个收到的消息进行相同的条件评估的情况下前进到下一个状态?

时间:2017-10-02 14:38:55

标签: c# akka.net

我有一个演员需要从各种来源收集数据,才能继续处理。目前,我对每个收到的消息重复相同的条件评估:

private Foo foo;
private Bar bar;

private void DoSomething(DoSomething message)
{
    this.BecomeWaitingForInputData();

    this.GetFoo(message.FooId); /* sends message */
    this.GetBar(message.BarId); /* sends message */
}

private void BecomeWaitingForInputData()
{
    this.Become(() =>
    {
        this.Receive<Foo>((message) =>
        {
            this.CollectFoo(message); /* assigns to foo */
            this.ProcessInputDataIfReady();
        });

        this.Receive<Bar>((message) =>
        {
            this.CollectBar(message); /* assigns to bar */
            this.ProcessInputDataIfReady();
        });
    });
}

private void ProcessInputDataIfReady()
{
    if (this.foo == null || this.bar == null) return;
    /* ... */
    this.BecomeWaitingForProcessResults();
}

有没有办法避免重复this.ProcessInputDataIfReady();,或者这是编写它的最佳方式?我能找到的大多数例子(例如this one)都是用Scala编写的,它似乎允许各种奇特的东西用它的语法,而且我在C#中没有真正看到等价物。

1 个答案:

答案 0 :(得分:1)

您可以使用FSM<> class in Akka.NET -docs- -source-,它允许您在处理每个事件时返回下一个行为。

目前编写的ReceiveActor并不允许Scala拥有的AndThen类型的运算符,所以如果您想坚持使用此设计,那么您需要{39}。据我所知,现在可能是最不痛苦的方式。