一个轻量级的 .NET 状态机库

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

上一篇
下一篇