gpt4 book ai didi

c# - 如何从 bbv.Common.StateMachine(现在是 Appccelerate.StateMachine)类获取当前状态?

转载 作者:可可西里 更新时间:2023-11-01 08:59:32 26 4
gpt4 key购买 nike

bbv.Common.StateMachine 类是我见过的最好的状态机代码。但它只缺少一件事:获取当前状态。

这是一个订单跟踪系统:

fsm = new ActiveStateMachine<States, Events>();

fsm.In(States.OrderCreated)
.On(Events.Submitted)
.Goto(States.WaitingForApproval);
fsm.In(States.WaitingForApproval)
.On(Events.Reject)
.Goto(States.Rejected);
fsm.In(States.WaitingForApproval)
.On(Events.Approve)
.Goto(States.BeingProcessed);
fsm.In(States.BeingProcessed)
.On(Events.ProcessFinished)
.Goto(States.SentByMail);
fsm.In(States.SentByMail)
.On(Events.Deliver)
.Goto(States.Delivered);

fsm.Initialize(States.OrderCreated);
fsm.Start();
fsm.Fire(Events.Submitted);
// Save this state to database

您可以很容易地看到它是如何工作的。

但是我想在数据库中保存订单状态。所以我将能够显示订单处于哪个状态。

我需要一个

fsm.GetCurrentState()
//show this state in the a table

方法。实际上有一种方法:我可以使用 ExecuteOnEntry 并在每个状态的条目上更改本地值。但是为每个状态编写 ExecuteOnEntry 会很麻烦,因为我会重复自己!

必须有一种微妙的方式来做到这一点。

最佳答案

正如 Daniel 所解释的,这是设计使然。让我解释一下原因:

状态机允许事件排队。因此,向状态机询问其当前状态可能会产生误导。它当前处于状态 A,但已经有一个事件排队,它将使其进入状态 B。

此外,我认为将状态机内部状态(您在状态机定义中使用的状态)直接与状态机外部状态(您希望保留在数据库中的状态)耦合在一起是糟糕的设计。如果您直接将这两者结合起来,您将失去在不影响外部(在您的情况下是数据库)的情况下在内部重构状态机的能力。我经常遇到我必须将状态 A 拆分为 A1 和 A2 的场景,因为我必须为它们附加不同的操作,但它们仍然向环境表示相同的状态。因此,我强烈建议您将内部状态和外部状态分开,就像您使用 ExecuteOnEntry() 编写的那样,或者通过提供映射和使用扩展来实现。这是一个扩展程序,可以让您了解当前状态:

public class CurrentStateExtension : ExtensionBase<State, Event>
{
public State CurrentState { get; private set; }

public override void SwitchedState(
IStateMachineInformation<State, Event> stateMachine,
IState<State, Event> oldState,
IState<State, Event> newState)
{
this.CurrentState = newState.Id;
}
}

您可以通过这种方式将扩展添加到状态机:

currentStateExtension = new CurrentStateExtension();
machine.AddExtension(currentStateExtension);

当然,您也可以直接使用此扩展来访问当前状态。为了使其更简单,让定义状态机的类实现扩展并将其自身作为扩展传递。让你摆脱多余的类。

最后一点:当您在 https://groups.google.com/forum/?fromgroups#!forum/appccelerate 的 google 群组中询问有关 bbv.Common(或现在称为 Appccelerate)的问题时,我更容易找到问题并回答它 ;-)

关于c# - 如何从 bbv.Common.StateMachine(现在是 Appccelerate.StateMachine)类获取当前状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13351081/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com