如何减少 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);
}
}
我有具有可切换行为的 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);
}
}