Я хотел бы использовать http://code.google.com/p/stateless в своем коде, чтобы отделить функциональность от ее зависимостей. Я не нашел каких-либо продвинутых примеров использования, так что этот вопрос касается лучших практик фреймворка без сохранения состояния.
У меня следующая конфигурация (это только пример, только одно состояние функции):
var stateMachine = new StateMachine(State.Stopped);
stateMachine.Configure(State.Stopped)
.Permit(Trigger.Failed, State.Error)
.Permit(Trigger.Succeed, State.GenerateMachineData);
stateMachine.Configure(State.GenerateMachineData)
.Permit(Trigger.Failed, State.Error)
.Permit(Trigger.Succeed, State.Finished);
public enum State
{
Stopped,
GenerateMachineData,
Finished,
Error
}
public enum Trigger
{
Succeed,
Failed
}
где тогда вызывать реальную функциональность. У меня были следующие идеи, но у каждого из них есть свои преимущества и недостатки:
1) Установите функциональность, а также следующий выстрел в OnEntry ():
stateMachine.Configure(State.GenerateMachineData)
.OnEntry(() => {
try {
Generate();
stateMachine.Fire(Trigger.Succeed);
} catch {
stateMachine.Fire(Trigger.Error);
}
})
.Permit(Trigger.Failed, State.Error)
.Permit(Trigger.Succeed, State.Finished);
так что если я просто позвоню
stateMachine.Fire(Trigger.Succeed);
заканчивается в State.Finished или State.Error
- преимуществ - все вместе
- Отклонения - решение не может быть действительно проверено
2) разделить машину состояний и функциональность следующим образом:
<pre>
void DoTheStuff() {
switch (stateMachine.State)
{
State.Stopped:
stateMachine.Fire(State.Succeed);
break;
State.GenerateMachineData:
Generate();
stateMachine.Fire(State.Succeed);
break;
default:
throw new Exception();
}
}</p>
<p>void Main()
{
while (stateMachine.State != State.Succeed && stateMachine.State != State.Error)
{
DoTheStuff();
}
}
- преимущества: состояние машины можно проверить самостоятельно
- недостатки: мне совсем не нравится
3) какое-то другое решение?
Буду рад любому ответу