如何减少 ReceiveActor 的代码重复

How to reduce code duplication for ReceiveActor

我有具有可切换行为的 Receive Actor,通过 Become() 方法切换。要监视子 actor,我必须向每个状态方法添加 Receive< Terminated > 调用。

例如,我必须将其粘贴到 Ready、Working1 和 Working2 方法中

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
    }
}

您正在使用 lambda 来执行您的操作,相反您可以创建一个采用 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);
    }
}