Ответ 1
Как объяснил Даниэль, это по дизайну. Позвольте мне объяснить, почему:
Конечный автомат допускает очередность событий. Поэтому, спрашивая государственную машину о ее текущем состоянии, можно ввести в заблуждение. В настоящее время он находится в состоянии A, но уже есть очередь событий, которая заставит его указывать B.
Кроме того, я считаю, что это плохой дизайн, чтобы связать внутренние состояния конечного автомата (те, которые вы используете в определении вашего конечного автомата) напрямую с внешними состояниями конечного автомата (те, которые вы хотите сохранить в базе данных). Если вы соединяете эти два напрямую, вы теряете возможность реорганизовать конечный автомат внутри себя, не нарушая (в вашем случае базу данных). Я часто сталкиваюсь с сценарием, в котором я должен разделить состояние A на A1 и A2, потому что мне приходится прикладывать к ним разные действия, но тем не менее они все еще представляют одно и то же состояние в среде. Поэтому я настоятельно рекомендую вам разделить внутренние и внешние состояния, как вы написали с помощью OnEntryExecute(), либо путем предоставления сопоставления и использования расширения. Это расширение, которое предоставит вам текущее состояние:
public class CurrentStateExtension : ExtensionBase<State, Event>
{
public State CurrentState { get; private set; }
public override void SwitchedState(
IStateMachineInformation<State, Event> stateMachine,
IState<State, Event> oldState,
IState<State, Event> newState)
{
this.CurrentState = newState.Id;
}
}
Вы можете добавить расширение в конечный автомат таким образом:
currentStateExtension = new CurrentStateExtension();
machine.AddExtension(currentStateExtension);
Конечно, вы можете использовать это расширение напрямую, чтобы получить доступ к текущему состоянию. Чтобы сделать его еще проще, пусть класс, который определяет конечный автомат, реализует расширение и передает себя как расширение. Позвольте вам избавиться от лишнего класса.
Последнее примечание: когда вы задаете вопросы о bbv.Common(или Appccelerate, как он называется сейчас) в группе google в https://groups.google.com/forum/?fromgroups#!forum/appccelerate, это проще для мне найти вопрос и ответить на него; -)