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

本文关键字:状态 定义 何定义 | 更新日期: 2023-09-27 18:13:21

我在我们的应用程序中使用无状态来实现状态机的逻辑。我们有一个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

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

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

statemmachine .cs中的文档说明:

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

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

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

这将执行AcceptedFile &ReadyForAdvertising,使当前状态为ReadyForAdvertising

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

现在可以使用无状态。可以配置子状态的初始状态,如下所示:

machine.Configure(State.AcceptedFile)
    .InitialTransition(State.ReadyForAdvertising);

链接:https://github.com/dotnet-state-machine/stateless initial-state-transitions