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