2016-11-11 134 views
0

我有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

回答

0

您正在使用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