You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Stateless实现触发时所有状态转至单一状态?

Stateless 全局触发器实现方案

Stateless 本身没有直接提供 RegisterGlobalTrigger 这类原生API,但可以通过以下更简洁的方式实现你的需求:

扩展方法封装(推荐)

可以封装一个扩展方法,一次性为所有已注册状态添加全局触发器规则,避免重复代码:

public static class StateMachineExtensions
{
    public static void RegisterGlobalTrigger<TState, TTrigger>(
        this StateMachine<TState, TTrigger> machine,
        TTrigger trigger,
        TState targetState)
    {
        foreach (var state in machine.GetStates())
        {
            // 跳过目标状态,避免不必要的自转换
            if (!EqualityComparer<TState>.Default.Equals(state, targetState))
            {
                machine.Configure(state)
                       .Permit(trigger, targetState);
            }
        }
    }
}

调用方式非常简洁:

machine.RegisterGlobalTrigger(Trigger.Fault, State.Faulted);
  • 该方法会遍历状态机中已注册的所有状态,自动添加触发器转换规则
  • 若后续动态新增状态,需重新调用此方法同步配置
  • 代码中已跳过目标状态Faulted的配置,避免冗余的自转换逻辑

优化版状态层次方案

你提到的父状态思路可以进一步简化,无需手动逐个关联继承关系,通过批量配置子状态实现:

// 定义父状态
var everyState = State.Every;
// 配置父状态的Fault触发器
machine.Configure(everyState)
       .Permit(Trigger.Fault, State.Faulted);
// 批量关联子状态
machine.Configure(State.Foo).SubstateOf(everyState);
machine.Configure(State.Bar).SubstateOf(everyState);

这种方式比逐个注册触发器更高效,也比手动为每个状态单独配置更简洁。

内容的提问来源于stack exchange,提问作者JasonC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 16:41:59