我想使用 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) 将状态机和功能分开,如:
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) 其他解决方案?
我会很高兴得到任何答案
最佳答案
Nicholas Blumhardt 写道 good post关于无状态框架。
关于c# - 如何利用无状态框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5253906/