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

6

我正在使用stateless来实现我们应用程序中状态机的逻辑。我们有一个AcceptedFile状态,其中包含其他内部(子)状态。问题是我不知道如何在代码中指示初始内部状态,以便当机器转换到AcceptedFile状态时,它也会自动转换到其初始内部状态。以下是我模拟此行为的方法:

 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状态。
有没有更好的实现方式?

创建一个虚拟状态,其唯一目的是成为初始状态,然后立即触发移动到正确状态的触发器。 - Lasse V. Karlsen
我认为这就是我正在做的方式 :) 谢谢 - Beatles1692
1
@LasseV.Karlsen 如果这样可以的话,为什么不将它发布成答案呢?这样 OP 就可以接受它了。谢谢。 - superjos
3个回答

5

StateMachine.cs的文档说明如下:

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

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

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

这将执行AcceptedFile和ReadyForAdvertising的入口动作,并使当前状态变为ReadyForAdvertising。

1
这种方法将您与子状态的了解联系在一起。如果您能在进入父状态时自动转换到起始子状态,那就更好了。 - Jack Ukleja

0

0

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


请问您能否详细说明一下您提出的解决方案?我不太明白它与问题的关系。TA - superjos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接