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 для каждого состояния, потому что я буду повторяться!
Должен быть деликатный способ сделать это.
