【问题标题】:Stateless library: change state after action with parameters无状态库:使用参数操作后更改状态
【发布时间】:2022-10-18 23:07:46
【问题描述】:

stateless 库中,可以使用带参数的触发器。我有一个简单的状态机,我希望用户可以运行一个带参数的方法,这个方法应该执行一个带参数的触发器,然后改变状态。我怎样才能做到这一点?例子:

public MyMachine {
  public enum MyStates {
    StateOne,
    StateTwo
  }
  
  public enum MyTriggers {
    FirstTrigger,
    SecondTrigger
  }

  public int MyNumber {get; private set;}
  private readonly StateMachine<MyStates, MyTriggers> _stateMachine;

  public MyMachine(){
    _stateMachine = new StateMachine<MyStates, MyTriggers>(MyStates.StateOne);

    var myFirstTrigger = machine.SetTriggerParameters<int>(MyTriggers.FirstTrigger);

    _stateMachine.Configure(MyStates.StateOne)
      .InternalTransition<int>(myFirstTrigger, (value, t) => OnSetMyNumber(value))
      .Permit(MyTriggers.FirstTrigger, MyStates.StateTwo);
  }

  void OnSetMyNumber(int value) => MyNumber = value;

  public void SetNumber(int value) => machine.Fire(myFirstTrigger, value);
}

然后调用它:

var machine = MyMachine();
machine.SetNumber(10);

引发以下异常:

System.InvalidOperationException: "Multiple permitted exit transitions are configured from state 'InitialState' for trigger 'CreateInitialPlan'. Guard clauses must be mutually exclusive."

这是因为.Permit(MyTriggers.FirstTrigger, MyStates.StateTwo)。但是,如果我删除此行,它不会更改为状态“StateTwo”。我错过了什么?

预期行为我想致电SetNumber(10),然后状态机应更改为状态“StateTwo”。

【问题讨论】:

    标签: c# parameter-passing stateless


    【解决方案1】:

    抱歉,如果我给出了答案,但由于我的声誉,我无法发表评论。你解决了这个问题吗?

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 2020-11-08
    相关资源
    最近更新 更多