6

我在我们的应用程序中使用无状态来实现状态机的逻辑。我们有一个AcceptedFile具有其他内部(子)状态的状态。问题是我不知道我应该如何在我的代码中指示初始内部状态,以便当一个机器转换到AccptedFile状态它也会自动转换到它的初始内部状态。这是我为模拟这种行为所做的:

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

ReadyForAdvertising是一个内部状态。AcceptedFile这在大多数情况下都可以正常工作,但是每当我将状态机的初始状态设置为AcceptedFile这样时:

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

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

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

4

2 回答 2

5

StateMachine.cs 中的文档指出:

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

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

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

这将执行 AcceptedFile 和 ReadyForAdvertising 的输入操作,并使您的当前状态为 ReadyForAdvertising。

于 2015-06-08T04:10:35.937 回答
0

这似乎是设计的方式。OnExit 是处理它的最安全的地方,因为它是无状态的。

于 2014-07-25T15:00:23.253 回答