【发布时间】: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