如何减少ReceiveActor的代码重复

如何减少ReceiveActor的代码重复

问题描述:

我有Receiveable Actor可切换行为,由Become()方法切换。为了监控儿童演员,我必须添加接收< Terminated>调用每个状态方法。如何减少ReceiveActor的代码重复

例如,我有

public class SomeActor : ReceiveActor 
{ 
    public SomeActor() 
    { 
     // create child actors 
     Become(Ready); 
    } 

    private void Ready() 
    { 
     Receive<InitMessage>(m => 
     { 
      Become(Working1); 
     }); 

     Receive<Terminated>(m => 
     { 
      // duplicated termination stuff 
      Become(Terminated); 
     }); 
    } 

    private void Working1() 
    { 
     Receive<InitMessage>(m => 
     { 
      Become(Working2); 
     }); 

     Receive<Terminated>(m => 
     { 
      // duplicated termination stuff 
      Become(Terminated); 
     }); 
    } 

    private void Working2() 
    { 
     Receive<InitParcerMessage>(m => 
     { 
      Become(Working1); 
     }); 

     Receive<Terminated>(m => 
     { 
      // duplicated termination stuff 
      Become(Terminated); 
     }); 
    } 

    private void Terminated() 
    { 
     // do some stuff 
    } 
} 
+1

很难理解你想要达到的目标。在akka监视/观看演员是一个术语与使用'Context.Watch(actorRef)'检查它的活力有关。请描述一下你真正想要在这里监控什么。 – Horusiath

+0

你可以触发一个事件并订阅所有的孩子,让他们知道什么时候你想在终止的时候,在某个中间点等处理终止方法。 – Zinov

+0

@Zinov你的意思是简单的c#事件吗? – bonzaster

您正在使用lambda来执行你的动作将其粘贴到就绪,Working1和Working2方法,相反,您可以创建需要的Terminated类型的私有方法该参数并在Receive操作中使用MethodGroup

public class SomeActor : ReceiveActor 
{ 
    public SomeActor() 
    { 
     // create child actors 
     Become(Ready); 
    } 

    private void Ready() 
    { 
     Receive<InitMessage>(m => 
     { 
      Become(Working1); 
     }); 

     ConfigureReceive(); 
    } 

    private void Working1() 
    { 
     Receive<InitMessage>(m => 
     { 
      Become(Working2); 
     }); 

     ConfigureReceive(); 
    } 

    private void Working2() 
    { 
     Receive<InitParcerMessage>(m => 
     { 
      Become(Working1); 
     }); 

     ConfigureReceive(); 
    } 

    private void Terminated() 
    { 
     // do some stuff 
    } 

    private void ConfigureReceive() 
    { 
     // Register Receive actors here 
     Receive<Terminated>(p => HandleTermination(p)); 
    } 

    // Here's our method to perform the same job with our Terminated parameter 
    private void HandleTermination(Terminated termination) 
    { 
     // Call our Become method 
     Become(Terminated); 
    } 
} 
+0

同意,但无论如何我必须添加此_Receive (HandleTermination); _无处不在。试想一下,我想以这种方式处理更多的消息类型,它将会有更多的重复行 – bonzaster

+0

我已经更新了代码段。你必须在某个地方有一些代码重复,但是这个更新将它修剪下来以保持你的'Receive'在一个方法中,所以你只需要在一个地方更新代码。 – ColinM

+0

谢谢,它似乎是答案 – bonzaster