c# - 如何利用无状态框架

标签 c# .net stateless-state-machine

我想使用 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/

相关文章:

C# 从多个线程对表执行批量更新,不会出现死锁

c# - 当属性之一可以为 null 时 GetHashCode

c# - Visual Studio 2015 无状态

c# - 状态机:确定下一个状态的多个条件?

c# - 带引号的标识符 - EF Code First

c# - Azure 缓存组策略

C#,我可以在不尝试获取锁的情况下检查它吗?

.net - 如何更改 "Generate Method Stub"以在 VS 中抛出 NotImplementedException?

c# - 计算非托管表的填充

c# - 无状态状态机库 - 适当的结构方式?