我有一个项目,其中大部分是线性工作流程。我正在尝试使用 .NET Stateless库作为工作流引擎/状态机。那里的示例数量有限,但我整理了以下代码:
private StateMachine<WorkflowStateType, WorkflowStateTrigger> stateMachine;
private StateMachine<WorkflowStateType, WorkflowStateTrigger>.TriggerWithParameters<Guid, DateTime> registrationTrigger;
private Patient patient;
public Patient RegisterPatient(DateTime dateOfBirth)
{
configureStateMachine(WorkflowState.Unregistered);
stateMachine.Fire<DateTime>(registrationTrigger, dateOfBirth);
logger.Info("State changed to: " + stateMachine.State);
return patient;
}
private void configureStateMachine(WorkflowState state)
{
stateMachine = new StateMachine<WorkflowState, WorkflowTrigger>(state);
registrationTrigger = stateMachine.SetTriggerParameters<DateTime>(WorkflowTrigger.Register);
stateMachine.Configure(WorkflowState.Unregistered)
.Permit(WorkflowTrigger.Register, WorkflowStateType.Registered);
stateMachine.Configure(WorkflowState.Registered)
.Permit(WorkflowTrigger.ScheduleSampling, WorkflowState.SamplingScheduled)
.OnEntryFrom(registrationTrigger, (dateOfBirth) => registerPatient(dateOfBirth));
}
private void registerPatient(DateTime dateOfBirth)
{
//Registration code
}
如您所见,我正在使用 Stateless Fire() 重载,它允许我传入触发器。这样我就可以让状态机处理业务逻辑,在这种情况下,是注册新患者的代码。
这一切都有效,但现在我想将所有状态机代码移动到另一个类中来封装它,但我在这样做时遇到了麻烦。我在这样做时遇到的挑战是:
- 实例化
StateMachine
对象需要您指定状态,并且State
是只读属性,只能在实例化时设置。 - my
registrationTrigger
必须在状态机配置期间进行实例化,并且还必须可供调用类使用。
如何克服这些项目并封装状态机代码?