Basic State Machine setup using Stateless

前端 未结 1 1554
逝去的感伤
逝去的感伤 2021-02-01 20:38

I have some fairly simple state needs (for now). I think I would like to model these using the Stateless api. (But I don\'t really know much about state machines, so I could b

1条回答
  •  有刺的猬
    2021-02-01 21:10

    The machine is in only one state at a time; the state it is in at any given time is called the current state. It can change from one state to another when initiated by a triggering event or condition, this is called a transition. from Finite-state machine on Wiki

    I believe, the trigger is this triggering event.

    Update:

    Of course trigger name sometimes can be equal to some of state names.

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

    Update:

    stateless is really nice framework! I've tried to implemented the functionality.

    States:

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

    Triggers:

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

    Order class:

    public class Order
    {
        private readonly StateMachine _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 CreateStateMachine()
        {
            StateMachine stateMachine = new StateMachine(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;
        }
    }
    

    Tester for Order class:

    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);
    

    0 讨论(0)
提交回复
热议问题