Безгражданство: как определить начальное подсостояние состояния?

Я использую 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

Другие вопросы по тегам