相关疑难解决方法(0)

如何封装.NET无状态状态机

我有一个项目,其中主要是线性工作流程.我正在尝试使用.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
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我正在使用Stateless Fire()重载,它允许我传入一个触发器.这样我就可以拥有状态机进程业务逻辑,在这种情况下,代码可以注册一个新患者.

这一切都有效,但现在我想将所有状态机代码移动到另一个类中来封装它,我在这方面遇到了麻烦.我这样做的挑战是:

  • 实例化StateMachine对象需要您指定state,并且State是一个只能在实例化时设置的只读属性.
  • registrationTrigger必须在状态机配置期间实例化,并且必须由调用类提供.

如何克服这些项并封装状态机代码?

c# stateless-state-machine

11
推荐指数
1
解决办法
6371
查看次数

自动推进状态机与无状态

我最近一直在试验Stateless(C#中的HSM)(https://code.google.com/p/stateless/),而且我遇到了一些我不确定如何实现的东西.

假设我有以下状态:

  • 开始.

我想要实现的是:当TCP连接(处于Connect状态)建立时,进入Read状态.或者,如果失败,则进入"完成"状态(它可能会返回"连接"状态并在超时后尝试新连接).

如何使用Stateless实现此自动推进功能,因为从状态内触发触发器会导致堆栈溢出异常?

干杯

c# state-machine stateless-state-machine

8
推荐指数
1
解决办法
1685
查看次数