我有一个演员需要从各种来源收集数据,才能继续处理。目前,我对每个收到的消息重复相同的条件评估:
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#中没有真正看到等价物。
答案 0 :(得分:1)
您可以使用FSM<>
class in Akka.NET -docs- -source-,它允许您在处理每个事件时返回下一个行为。
目前编写的ReceiveActor
并不允许Scala拥有的AndThen
类型的运算符,所以如果您想坚持使用此设计,那么您需要{39}。据我所知,现在可能是最不痛苦的方式。