使用无状态的基本状态机设置

本文关键字:状态机 设置 状态 | 更新日期: 2023-09-27 18:22:21

我有一些相当简单的状态需求(目前)。我想我想使用无状态api对这些进行建模。(但我对状态机了解不多,所以我可能错了。)

但我被术语所困扰(特别是状态触发器

这里有一个例子:我有一个订单类。它是由几个状态设置的。它们是:新建、已填充、运输、已完成、已取消。

我想要的几个简单的状态规则是允许这些状态转换:

  • 新建(默认设置)
  • 新建->已填充
  • 新建->已取消
  • 已填充->运输
  • 已填充->已取消
  • 已填充->运输
  • 运输->完成

所以我在这里被绊倒的地方是我的"触发器"是什么?

万一需要一个更具体的例子,比如说我想要一个这样的方法:

public bool UpdateOrderStatus(int OrderId, OrderStatusEnum NewOrderStatus)

如果状态更新成功,则返回true。如何设置和使用Stateless来实现这一点?

使用无状态的基本状态机设置

机器一次只能处于一种状态;它在任何时候的状态给定的时间称为当前状态。它可以从一个状态更改当由触发事件或条件启动时,这是称为过渡。来自Wiki 上的有限状态机

我相信,触发器就是这个触发事件

更新:

当然,触发器名称有时可以等于某些状态名称。

New (initial state)
New -> Filled (trigger "Filled")
New -> Cancelled (trigger "Cancelled")
Filled -> Shipping (trigger "ToBeShipped")
Filled -> Cancelled (trigger "Cancelled")
Shipping -> Complete (trigger "Completed").

更新:

无状态框架真的很好!我已尝试实现该功能。

州:

public enum State
{
    New,
    Filled,
    Shipping,
    Cancelled,
    Completed
}

触发器:

public enum Trigger
{
    Filled,
    Cancelled,
    ToBeShipped,
    Completed
}

订单类别:

public class Order
{
    private readonly StateMachine<State, Trigger> _stateMachine;
    public Order()
    {
        _stateMachine = CreateStateMachine();
    }
    public bool TryUpdateOrderStatus(Trigger trigger)
    {
        if (!_stateMachine.CanFire(trigger))
            return false;
        _stateMachine.Fire(trigger);
        return true;
    }
    public State Status
    {
        get
        {
            return _stateMachine.State;
        }
    }
    private StateMachine<State, Trigger> CreateStateMachine()
    {
        StateMachine<State, Trigger> stateMachine = new StateMachine<State, Trigger>(State.New);
        stateMachine.Configure(State.New)
            .Permit(Trigger.Filled, State.Filled)
            .Permit(Trigger.Cancelled, State.Cancelled);
        stateMachine.Configure(State.Filled)
            .Permit(Trigger.ToBeShipped, State.Shipping)
            .Permit(Trigger.Cancelled, State.Cancelled);
        stateMachine.Configure(State.Shipping)
            .Permit(Trigger.Completed, State.Completed);
        stateMachine.OnUnhandledTrigger((state, trigger) =>
            {
                Console.WriteLine("Unhandled: '{0}' state, '{1}' trigger!");
            });
        return stateMachine;
    }
}

订单类别测试仪:

Order order = new Order();
bool result = order.TryUpdateOrderStatus(Trigger.Completed);
Console.WriteLine("Attemp to complete order: {0}", result);
Console.WriteLine("Order status: {0}", order.Status);
result = order.TryUpdateOrderStatus(Trigger.ToBeShipped);
Console.WriteLine("Attemp to ship order: {0}", result);
Console.WriteLine("Order status: {0}", order.Status);
result = order.TryUpdateOrderStatus(Trigger.Cancelled);
Console.WriteLine("Attemp to cancel order: {0}", result);
Console.WriteLine("Order status: {0}", order.Status);