Безгражданство: как определить начальное подсостояние состояния?
Я использую Stateless для реализации логики конечного автомата в нашем приложении. У нас есть AcceptedFile
состояние, которое имеет другие внутренние (под) состояния. Проблема в том, что я не знаю, как мне указать начальное внутреннее состояние в моем коде, чтобы при переходе машины в AccptedFile
заявить, что он также автоматически перейдет в исходное внутреннее состояние. Вот что я сделал, чтобы смоделировать это поведение:
machine.Configure(State.AcceptedFile)
.OnEntry(() => machine.Fire(Trigger.MakeReadyForAdvertising))
.Permit(Trigger.MakeReadyForAdvertising,State.ReadyForAdvertising)
Вот ReadyForAdvertising
это внутреннее состояние AcceptedFile
Это прекрасно работает в большинстве сценариев, но всякий раз, когда я устанавливаю исходное состояние моего конечного автомата в AcceptedFile
как это:
var statemachine=new StateMachine<State,Trigger>(State.AcceptedFile)
...
Автоматический переход не произойдет, поэтому машина будет в состоянии AcceptedFile вместо ReadyForAdvertising
,
Есть ли лучший способ реализовать это поведение?
3 ответа
Документация в StateMachine.cs гласит:
Подсостояния наследуют разрешенные переходы своего супергосударства. При входе непосредственно в подсостояние снаружи супергосударства выполняются действия входа для суперсостояния. Аналогичным образом, при выходе из подсостояния за пределы суперсостояния выполняются действия выхода для суперсостояния.
Поэтому, если ReadyForAdvertising - ваше внутреннее состояние по умолчанию, просто установите начальное состояние ReadyForAdvertising (или перейдите к нему при получении соответствующего триггера).
var statemachine=new StateMachine<State,Trigger>(State.ReadyForAdvertising)
Это выполнит действия ввода для AcceptedFile & ReadyForAdvertising и сделает ваше текущее состояние ReadyForAdvertising.
Кажется, это спроектированный способ. OnExit - самое безопасное место, чтобы справиться с этим, учитывая его безгражданскую природу.
Теперь это возможно с Stateless. Вы можете настроить начальное состояние ваших подсостояний, например:
machine.Configure(State.AcceptedFile)
.InitialTransition(State.ReadyForAdvertising);
Ссылка: https://github.com/dotnet-state-machine/stateless#initial-state-transitions