C# Stateless库OnUnhandledTrigger与状态恢复最佳实践
针对C# Stateless库非法触发跳转到指定错误状态的最佳实践
针对你的需求,Stateless库本身提供了规范的实现方式,无需使用临时增删转移、外部存储状态这类hack方案,以下是两种生产环境常用的实现方案:
方案1:直接调用SetState手动修改状态(最简方案)
Stateless的StateMachine类公开了SetState方法,专门用于手动修改状态机的当前状态,你可以直接在OnUnhandledTrigger/OnUnhandledTriggerAsync回调中调用该方法切换到错误状态:
// 定义状态、触发器枚举 enum State { Start, Accepting, Subnegotiation, Echo, ErrorState } enum Trigger { Accept, Subnegotiate, T1, ExpectedBadTrigger, UnexpectedBadTrigger } var stateMachine = new StateMachine<State, Trigger>(State.Start); // 配置正常转移逻辑 stateMachine.Configure(State.Start) .Permit(Trigger.Accept, State.Accepting); stateMachine.Configure(State.Accepting) .Permit(Trigger.Subnegotiate, State.Subnegotiation); stateMachine.Configure(State.Subnegotiation) .Permit(Trigger.T1, State.Echo) .Permit(Trigger.ExpectedBadTrigger, State.ErrorState); // 配置未处理触发的回调 stateMachine.OnUnhandledTrigger((state, trigger) => { // 直接切换到错误状态 stateMachine.SetState(State.ErrorState); // 可扩展添加日志打印、错误上报等逻辑 });
注意:该方案不会触发原状态的Exit回调,也不会触发错误状态的Entry回调,适合不需要执行状态切换附加逻辑的场景。
方案2:提前配置全局错误转移(规范方案,推荐)
如果希望错误跳转走标准的状态机转移流程,触发对应状态的Enter/Exit回调、且转移过程能被状态机的审计、日志模块捕获,可以提前定义一个全局错误触发器,给所有状态配置跳转错误状态的转移,在未处理触发的回调中直接触发该触发器即可:
// 新增全局错误触发器 enum Trigger { Accept, Subnegotiate, T1, ExpectedBadTrigger, UnexpectedBadTrigger, ForceEnterError } var stateMachine = new StateMachine<State, Trigger>(State.Start); // 配置正常转移逻辑(同上) // 给所有业务状态配置跳转到错误状态的通用转移 stateMachine.Configure(State.Start) .Permit(Trigger.ForceEnterError, State.ErrorState); stateMachine.Configure(State.Accepting) .Permit(Trigger.ForceEnterError, State.ErrorState); stateMachine.Configure(State.Subnegotiation) .Permit(Trigger.ForceEnterError, State.ErrorState); stateMachine.Configure(State.Echo) .Permit(Trigger.ForceEnterError, State.ErrorState); // 错误状态本身配置忽略该触发器,避免重复触发 stateMachine.Configure(State.ErrorState) .Ignore(Trigger.ForceEnterError) .OnEntry(() => { // 可扩展执行资源清理、告警推送等错误处理逻辑 }); // 配置未处理触发的回调 stateMachine.OnUnhandledTrigger((state, trigger) => { stateMachine.Fire(Trigger.ForceEnterError); });
这种方案完全符合状态机的设计规范,所有状态切换的附加逻辑都会正常执行,是生产环境的首选方案。
内容的提问来源于stack exchange,提问作者Mercutio
相关产品推荐
相关产品推荐

