无状态:如何定义状态的初始子状态?

时间:2014-07-17 08:07:44

标签: c# state-machine stateless-state-machine

我正在使用stateless在我们的应用程序中实现状态机的逻辑。我们有一个AcceptedFile状态,其他内部(子)状态。问题是我不知道应该怎么做我在我的代码中指出了初始内部状态,这样当机器转换到AccptedFile状态时,它也会自动转换到其初始内部状态。这就是我为模拟这种行为所做的:

 machine.Configure(State.AcceptedFile)
                    .OnEntry(() => machine.Fire(Trigger.MakeReadyForAdvertising))
                    .Permit(Trigger.MakeReadyForAdvertising,State.ReadyForAdvertising)

此处ReadyForAdvertisingAcceptedFile的内部状态。这在大多数情况下都能正常工作,但每当我将状态机的初始状态设置为AcceptedFile时,这样:

var statemachine=new StateMachine<State,Trigger>(State.AcceptedFile)
...

不会发生自动转换,因此机器将处于AcceptedFile状态而不是ReadyForAdvertising

有没有更好的方法来实现此行为?

2 个答案:

答案 0 :(得分:4)

StateMachine.cs中的文档声明:

  

Substates继承其超状态允许的转换。当从超状态外部直接进入子状态时,执行超状态的进入操作。同样,当从子状态离开超级状态时,将执行超状态的退出操作。

因此,如果ReadyForAdvertising是您的默认内部状态,只需将初始状态设置为ReadyForAdvertising(或在收到适当的触发器时转换为它)

var statemachine=new StateMachine<State,Trigger>(State.ReadyForAdvertising)

这将执行AcceptedFile&amp;的入口操作。 ReadyForAdvertising并使您的当前状态为ReadyForAdvertising。

答案 1 :(得分:0)

这似乎是设计方式。鉴于其无国籍性质,OnExit是最安全的处理它。