Stateless 库——一个轻量级的 .NET 状态机库,用于在 C# 中建模有限状态机(Finite State Machine, FSM)。
项目背景
项目地址:https://github.com/dotnet-state-machine/stateless
stateless
是一个用于 .NET 的开源状态机库,允许开发者以声明式方式定义对象的状态转换逻辑。
别人的总结
https://www.cnblogs.com/hsiang/p/19031278
官方例子说明
核心概念
- 状态(State):表示系统当前所处的阶段,如
OffHook
,Ringing
,Connected
,OnHold
。 - 触发器(Trigger):引起状态变化的事件,如
CallDialled
,MuteMicrophone
。 - 状态机通过
StateMachine<State, Trigger>
类定义,泛型参数分别为状态和触发器类型。
代码功能解析
var phoneCall = new StateMachine<State, Trigger>(State.OffHook);
- 创建一个状态机实例,初始状态为
OffHook
(电话挂起)。
phoneCall.Configure(State.OffHook)
.Permit(Trigger.CallDialled, State.Ringing);
- 配置
OffHook
状态下的行为:当触发CallDialled
事件时,允许状态从OffHook
转换到Ringing
。
phoneCall.Configure(State.Connected)
.OnEntry(t => StartCallTimer()) // 进入 Connected 状态时启动计时器
.OnExit(t => StopCallTimer()) // 离开 Connected 状态时停止计时器
.InternalTransition(Trigger.MuteMicrophone, t => OnMute())
.InternalTransition(Trigger.UnmuteMicrophone, t => OnUnmute())
.InternalTransition<int>(_setVolumeTrigger, (volume, t) => OnSetVolume(volume))
.Permit(Trigger.LeftMessage, State.OffHook)
.Permit(Trigger.PlacedOnHold, State.OnHold);
- 对
Connected
状态进行详细配置: OnEntry
/OnExit
:进入或退出该状态时执行的动作(如启动/停止通话计时)。InternalTransition
:处理不引起状态改变的内部事件(如静音、调音量),仅执行动作。Permit
:允许某些触发器导致状态转移(如“留言”回到OffHook
,“保持”进入OnHold
)。
phoneCall.Fire(Trigger.CallDialled);
Assert.AreEqual(State.Ringing, phoneCall.State);
- 手动触发
CallDialled
事件。 - 验证状态是否成功从
OffHook
转移到Ringing
。