.Net 轻量级状态机Stateless的使用(二)——子状态

Stateless支持子状态(substate),可以是多层级的状态。如果一个状态机处于子状态,那么它也处于这个子状态的上级状态。我们继续前面的例子说明子状态和状态的关系,在前面的流程中,我们可以为“请假申请”添加一个子状态“填写申请表”,并且认为填写完成就直接提交,代码如下:

            var stateMachine = new StateMachine("请假申请");

            stateMachine.Configure("请假申请").Permit("提交申请", "部门经理审批");
            stateMachine.Configure("填写申请表").SubstateOf("请假申请").Permit("填写完成", "部门经理审批");
            stateMachine.Configure("部门经理审批").Permit("需要修改", "请假申请");
            stateMachine.Configure("部门经理审批").Permit("审批完成", "结束");

            stateMachine.OnUnhandledTrigger((state, trigger) => { });

            var info = stateMachine.GetInfo();

            while (true)
            {
                Console.WriteLine(stateMachine.State);
                Console.WriteLine("输入命令");
                var command = Console.ReadLine();
                stateMachine.Fire(command);

                if (stateMachine.State == "结束") break;
            }
            Console.WriteLine(stateMachine.State);
            Console.WriteLine("流程结束");

注意,我们设置的初始状态仍然是“请假申请”。这时运行程序,输入“填写完成”,并没有跳转到“部门经理审批”,状态仍然是“请假申请”:


图片.png

如果把初始状态改为“填写申请表”,再次运行,输入“填写完成”,会跳转到“部门经理审批”:


图片.png

这与我们预想的一样,再次运行,输入“提交申请”,同样会跳转到“部门经理审批”:
图片.png

这说明在子状态下,触发上级状态跳转的条件也是起作用的。

你可能感兴趣的:(.Net 轻量级状态机Stateless的使用(二)——子状态)