介绍

Automatonymous是.NET开发人员的状态机库。它提供了一种流畅的语法来声明状态机,包括状态,事件(支持触发器和数据事件)以及状态/事件活动。尽管Automatonymous在简单的状态机上非常容易使用,但它具有许多高级功能,使它可以在各种上下文中使用。

快速入门

跟随官网提供的快速入门demo,定义了一个关系状态机,关系状态有两种:Friend(朋友-友好)、Enemy(敌人-敌意),三个可以引发的事件:Hello(打招呼)、PissOff(走开)、Introduce(自我介绍)。打招呼->友好、走开->敌意、自我介绍->友好状态。

创建一个控制台应用程序,然后安装Automatonymous

我们创建两个类,一个类表示状态(Relationship),另一个类定义状态的行为(RelationshipStateMachine),代码如下:

 /// /// 状态类/// public class Relationship{public State CurrentState { get; set; }public string Name { get; set; }}/// /// 状态机/// public class RelationshipStateMachine :AutomatonymousStateMachine{public State Friend { get; private set; }public State Enemy { get; private set; }public Event Hello { get; private set; }public Event PissOff { get; private set; }public Event Introduce { get; private set; }public RelationshipStateMachine(){//定义当前 状态属性 InstanceState(x => x.CurrentState);//定义事件Event(() => Hello);Event(() => PissOff);Event(() => Introduce);// 定义状态State(() => Friend);State(() => Enemy);Initially(When(Hello).Then(p => Console.WriteLine("StateMachine: Hello")).TransitionTo(Friend),When(PissOff).Then(ctx => Console.WriteLine(ctx.Instance.CurrentState.Name)).TransitionTo(Enemy),When(Introduce).Then(p =>{p.Instance.Name = p.Data.Name;Console.WriteLine($"你好:{p.Instance.Name},这是状态机简单入门篇");}).TransitionTo(Friend).Finalize());}}/// /// 事件数据/// public class Person{public string Name { get; set; }}

小结:在Automatonymous中 ,状态是使用类进行管理的,如上面的Relationship。状态机行为类定义需要继承行为类需要继续AutomatonymousStateMachine类,它是泛型类,需指定与行为关联的状态类型如AutomatonymousStateMachine。默认情况下,事件或状态的所有公共属性都将在基类的构造函数中自动定义和初始化。在构造函数中使用lambda方法Event和state方法明确地定义事件和状态。

客户端引发事件

支持事件无数据和有数据两种方式,代码如下:

static void Main(string[] args){var relationship = new Relationship();var machine = new RelationshipStateMachine();//machine.RaiseEvent(relationship, machine.Hello); 无数据var person = new Person { Name = "知音" };machine.RaiseEvent(relationship, machine.Introduce, person);//指定事件需要的数据}

输出

.NET 状态机Automatonymous快速入门相关推荐

  1. Unity快速入门之四 - Unity模型动画相关

    最近要给公司的小伙伴做Unity入门,针对几个常用的知识进行快速入门介绍. Unity快速入门之一 3D基础概念.Camera.Canvas RenderMode的几种方式对比_翕翕堂 Unity快速 ...

  2. nDPI – 快速入门指南

    (注:最近在学习ntop这个工具,其核心是nDPI这个库,关于这个库,官方有一个快速入门指南,不过肯定是英文的,我在阅读过程中,顺便翻译了一下,当然个人知识有限,翻译的有问题的地方,望留言指正,感谢. ...

  3. NI labview2014/2015/2016的超快速入门教程之使用VI模板(培训一)

    先说说我的超快速入门,一共共讲五部分,每一部分内容是精华的东西,但都有大量图文说明,因此显得东西很多,仔细看下去,对于尚未入门的同学应该是收获很多的 培训一:使用VI模板   培训二:创建一个可安装的 ...

  4. asm使用指南中文-md版快速入门详解

    asm4-guide-英文.pdf asm4-guide-中文 还是人家官网文档写得好,什么快速入门都不如官方文档,阅读两小时,就知道怎么回事了. ASM使用指南中文版 1. 介绍 1.1. 动机 1 ...

  5. 带你快速入门AXI4总线--AXI4-Full篇(3)----XILINX AXI4-Full接口IP源码仿真分析(Master接口)

    写在前面 接slave接口篇,本文继续打包一个AXI4-Full-Master接口的IP,学习下源码,再仿真看看波形. 带你快速入门AXI4总线--AXI4-Full篇(2)----XILINX AX ...

  6. React VR 快速入门完全教程

    React VR 快速入门 什么是React React是一个开放源代码的JavaScript库,为HTML呈现的数据提供了视图渲染.React视图通常使用指定的像HTML标签一样的组件来进行UI渲染 ...

  7. Verilog快速入门(8)—— 4bit超前进位加法器电路

    Verilog快速入门 (1) 四选一多路器 (2)异步复位的串联T触发器 (3)奇偶校验 (4)移位运算与乘法 (5)位拆分与运算 (6)使用子模块实现三输入数的大小比较 (7)4位数值比较器电路 ...

  8. React框架快速入门

    React快速入门 React快速入门 ReactJS介绍 ReactJS是什么 React高效的原因 React的几个重要概念 React的使用 与使用有关的理解 写个Hello world Rea ...

  9. Shiro第一个程序:官方快速入门程序Qucickstart详解教程

    目录 一.下载解压 二.第一个Shiro程序 1. 导入依赖 2. 配置shiro配置文件 3. Quickstart.java 4. 启动测试 三.shiro.ini分析 四.Quickstart. ...

最新文章

  1. Openfire服务器的安装部署
  2. Swagger增强神器:Knife4j!用它轻松实现接口搜索、Word下载、接口过滤...
  3. 转载:Java 内存区域和GC机制
  4. int main(int argc,char* argv[])详解(原)
  5. vxworks gcc linux,针对VxWorks的GCC交叉编译器无法编译C++
  6. Spring框架中的SpringFactoriesLoader
  7. CXF与Web项目集成---without Spring
  8. leetcode1169. 查询无效交易
  9. 13 SD配置-企业结构-分配-给销售办公室分配销售组
  10. Python的实例方法,类方法,静态方法之间的区别及调用关系
  11. python入门指南-如何学习Python,以及新手如何入门?
  12. java 数组 null值_数组的元素String在java中包含null
  13. 网卡设备状态显示错误代码56
  14. 【K8S】K8s部署Metrics-Server服务
  15. 基于单片机的智能花盆
  16. 数据指标体系搭建实践
  17. SSMS18.9.1证书被颁发者直接吊销
  18. 【RCNN】论文翻译-用于精确物体定位和语义分割的丰富特征层次结构
  19. 初识C语言系列-5-完结篇-#define,指针,结构体
  20. 区块链:现实与未来的二律背反

热门文章

  1. Python-理解装饰器
  2. robocopy帮助
  3. 数据同步云端本地_如何从云端删除Windows 8的同步数据
  4. 计算机网络拓跋结构,实战 | 服务端开发与计算机网络结合的完美案例
  5. web第6次作业position
  6. Skype for TV停止支持 三星确认今年6月移除该应用
  7. 基于Redis的MQ中间件实现-目录
  8. struts2配置中Action的name 和package的name和namespace作用
  9. DexClassLoader的使用
  10. android进程间通信:使用AIDL