目录标题

  • Stateless 简介
  • Stateless 简单用法
  • Stateless 初级用法
  • Stateless 进阶用法
  • .net 库集合

Stateless 简介

Stateless 是基于 C# 实现状态机的库。详见 Github - Stateless

Stateless 简单用法

1 - 定义状态(State)以及不同状态间转换的触发器(Trigger)。
简例中用枚举类型定义 State 及 Trigger:

enum State
{state1,state2,state3
}enum Trigger
{trigger1,trigger2
}

2 - 定义状态机对象:

StateMachine<State, Trigger> _machine = new StateMachine<State, Trigger>(State.state1);

某一时刻,状态机 _machine 处于某一状态,比如 state1,此时通过不同的 Trigger 可以触发该状态机转变到不同的状态。至于,状态机处于各个状态时,不同的 Trigger 会触发其转换到何种状态,需要对状态机进行配置。

3 - 配置状态机对象:

_machine.Config(State.state1).Permit(Trigger.trigger1, State.state2).Permit(Trigger.trigger2, State.state3);_machine.Config(State.state2).Permit(Trigger.trigger1, State.state3).Permit(Trigger.trigger2, State.state1);

在该配置下,当 _machine 处于 State.state1 时,Trigger.trigger1 可触发其转换到 State.state2 状态, Trigger.trigger2 可触发其转换到 State.state3 状态;当_machine 处于 State.state2 时,Trigger.trigger1 可触发其转换到 State.state3 状态, Trigger.trigger2 可触发其转换到 State.state1 状态。以此类推。

4 - 状态机状态改变触发函数

_machine.Fire(Trigger.trigger1);

当某事件发生时,可通过 .Fire(Trigger tg) 函数触发状态机的状态转换。

Stateless 初级用法

下面介绍一些 Stateless 的基本函数及用法。

1 - Stateless 在某状态下执行的函数。
我们在使用状态机时,不仅希望能通过一定的逻辑设置,使得状态机响应某些事件(Trigger)时,能够转入特定的状态。同时,我们还希望状态机在处于某种状态,或状态转换时,能够执行一些用户操作。Stateless 通过设定一系列的 Action 来实现这样的功能。

_machine.Config(State.state1).OnEntry(t => state1Entry()).OnExit(t => state1Exit()).InternalTransition(Trigger.triggerX, t => state1Tick()).Permit(Trigger.trigger1, State.state2).Permit(Trigger.trigger2, State.state3);void state1Entry() { /* 函数实现 */ }
void state1Exit() { /* 函数实现 */ }
void state1Tick() { /* 函数实现 */ }

其中,.OnEntry(t => state1Entry()) 设置了状态机在由其他状态进入到 State.state1 时执行的用户操作。用户操作通过函数 state1Entry() { /* 函数实现 */ } 实现。.OnExit(t => state1Exit()) 同理,可以实现离开状态State.state1 时的用户操作。
.InternalTransition(Trigger.triggerX, t => state1Tick()) 可以认为是状态机被设置为,在触发器 Trigger.triggerX 作用下可以重复进入State.state1。比如定时器重复触发事件,执行 _machine.Fire(Trigger.triggerX); 可以使状态机重复 State.state1 状态,即实现 InternalTransition 。此时,执行用户操作 state1Tick() { /* 函数实现 */ }

2 - 带参数触发 Trigger with parameter
有时候,某事件发生时,我们不仅希望能触发状态机转换状态,还希望能同时传递一些参数。比如,当定时器事件时,触发状态机重复 State.state2 的 internalTransation,并执行 state2Tick( float tic ) 函数,并将定时器的时间传递给该函数。那么,这里就需要用到带参数的触发。

StateMachine<State, Trigger>.TriggerWithParameters<int> _TriggerP= _machine.SetTriggerParameters<int>(Trigger.TriggerP);_machine.Config(State.state2).InternalTransition(_TriggerP, (tick, t) => state2Tick(tic));void state2Tick( int tic ) { /* 函数实现 */ }_machine.Fire(_TriggerP, 100);

同样还有

StateMachine<State, Trigger>.TriggerWithParameters<float> _TriggerP2= _machine.SetTriggerParameters<float>(Trigger.TriggerP2);
_machine.Config(State.state2).PermitIf<float>(_TriggerP2, State3, tp => !ckBool(tp)).PermintIf<float>(_TriggerP2, State1, tp => ckBool(tp));bool ckBool( float tp) { /* 判断返回布尔值*/ }

通过该配置,触发 _TriggerP2 时,同时传递参数 float tp ,通过函数 ckBool( tp ) 的真假,决定状态机转入 State.state3 或者 State.state1 。这样增加了状态机的灵活性。

3 - 其他

// on transition action_machine.OnTransitioned(OnTransitionedAction);// on unhandled trigger_machine.OnUnhandledTrigger(OnUnhandledTrigger);void OnTransitionedAction(StateMachine<State, Trigger>.Transition act) { /* 函数实现 */ }void OnUnhandledTrigger(State st, Trigger tg) { /* 函数实现 */ }

如果出现未配置的触发,可以通过设置 .OnUnhandledTrigger(OnUnhandledTrigger) 进行处理。

Stateless 进阶用法

待续

.net 库集合

github 上有大神整理收集了许多优秀的 .net library,如
SharpSCADA
awesome-dotnet-core
awesome-dotnet
ReactiveUI

C# 状态机 Stateless 3.0相关推荐

  1. Stateless 3.0——.NET Core上的状态机库

    Stateless是一个基于C#,创建状态机的简单库,最新版本支持.NET Core 1.0.其实现方式并不是通过.NET Core,而是通过写入.NET Standard实现的.就像Android平 ...

  2. .Net轻量状态机Stateless

    很多业务系统开发中,不可避免的会出现状态变化,通常采用的情形可能是使用工作流去完成,但是对于简单场景下,用工作流有点大财小用感觉,比如订单业务中,订单状态的变更,涉及到的状态量不是很多,即使通过简单的 ...

  3. C#状态机Stateless

    最近在折腾一些控制相关的软件设计,想起来状态机这个东西,对解决一些控制系统状态切换还是挺有用的. 状态机(有限状态自动机)网上有很多介绍.简单理解就是定义一系列状态,通过一系列的事件,可以使得状态可以 ...

  4. 【转】浅析C# 状态机Stateless

    最近在折腾一些控制相关的软件设计,想起来 状态机 这个东西,对解决一些控制系统状态切换还是挺有用的. 状态机(有限状态自动机)网上有很多介绍.简单理解就是定义一系列状态,通过一系列的事件,可以使得状态 ...

  5. 状态机 Stateless VS StateMachine

    [什么是状态机] 一句话概括: 状态机是有限状态自动机的简称,是现实事物运行规则抽象而成的一个数学模型. 来解释什么是"状态"( State ).现实事物是有不同状态的,例如一个自 ...

  6. 状态机 stateless_Stateless 3.0-.NET Core的状态机库

    状态机 stateless State Machines and business processes that describe a series of states seem like they' ...

  7. 前端状态机系列:SCXML与XState对应关系

    1. 前置说明 这次再说明下自己对状态图的看法.状态图虽然有非常多的优势(参考上篇文章),如果你想使用,关于是否对整个旧项目进行全量状态图化,这里给一个适应范围是:项目中复杂的部分进行状态图建模是非常 ...

  8. COLA 4.0:应用架构的最佳实践

    前几天和几个饿了么的同学聊天,一听说他们还在用COLA 1.0,我二话没说,90度鞠躬,赔礼道歉,虚心聆听他们的吐槽.COLA的初衷旨在控制复杂度,救码农于水火,惭愧的是,早期的思想不成熟,设计也多有 ...

  9. COLA 4.0 - DDD项目实践

    更多内容关注微信公众号:fullstack888 COLA分层架构 COLA 4.0 架构分成COLA架构和COLA组件两个部分: COLA架构:关注应用架构的定义和构建,提升应用质量. COLA组件 ...

最新文章

  1. 树莓派ssh连接问题
  2. 乐视欠122亿的图标给后浪的启示
  3. leetcode 两数相加c++_167. 两数之和 II - 输入有序数组
  4. mysql 5.5 5.6 备份库_mysql5.5备份数据库里面除系统库外的所有数据库
  5. 将一副图片编译进uboot
  6. Java基础之路--引用数据类型之数组
  7. Quotations
  8. 【紫书第九章】动态规划(DP)常见模型汇总与DP问题分析方法
  9. 有意思的签到题集合~~
  10. 大一高等数学期末考试试卷及答案详解
  11. 数模笔记:蒙特卡洛模型
  12. java期末复习题目
  13. python图像质量评价_图像质量评价和视频质量评价(IQA/VQA)
  14. 人教版,北师大版,北京版和苏教版的四年级数学知识点对比(附视频)
  15. gRPC源码阅读及实践之 Resolver
  16. 算法原理系列:红黑树
  17. 求职季之你必须要懂的原生JS(中)
  18. 企业邮箱网页登录入口,网页电子邮箱怎么注册?
  19. 2、oracle全文检索
  20. 个人作业--四则运算3

热门文章

  1. 【Windows使用笔记】Windows日常使用软件
  2. H全桥电路驱动:自举电路
  3. 解决GitHub不显示图片问题
  4. IL2CPP MONO unity 编译器
  5. AWS EC2 实例Stop、Terminate、Hibernate的区别
  6. java远程调试_JAVA的远程调试方法
  7. BTrace安装和使用
  8. 一篇文章带你了解3D 打印机,新手点进来
  9. 【项目】实现对接京东财务余额管理页面
  10. 12.09京东金融面试归来