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

Stateless是一个基于C#,创建状态机的简单库,最新版本支持.NET Core 1.0。其实现方式并不是通过.NET Core,而是通过写入.NET Standard实现的。就像Android平台上API级别抽象出许多底层版本的Android,.NET Standard是一组所有.NET平台上都必须实现的API。

更令开发者高兴的是,Stateless 3.0基于.NET Standard 1.0编写,是一个被广泛使用和最具兼容性的标准版本,几乎可以运行在任何地方,从Windows平台上的.NET Framework、.NET Core到Mac,和Windows应用商店以及所有的移动平台。

特征:

支持大多数标准状态机构造:

  • 支持任何.NET类型(数字、字符串、枚举等)状态和触发器;

  • 分层状态;

  • 状态的进入/退出事件;

  • Guard子句以支持条件转换;

  • 内省。

与此同时,还提供一些有用的扩展:

  • 支持外部的状态存储(例如:由ORM跟踪属性);

  • 参数化触发器;

  • 可重入状态;

  • 支持DOT格式图导出。

使用Stateless创建一个简单的状态机

下面来看几个代码示例。先描述一些有限状态,例如一个枚举类型和一些用于改变状态的有限“触发器”,就像开发一样,来启动和关闭状态以及进行触发器切换。


另一个更加实用的例子是Bug Tracker,源码在GitHub上。下面是一个Bug和触发器状态,引起状态改变:

enum State { Open, Assigned, Deferred, Resolved, Closed }enum Trigger { Assign, Defer, Resolve, Close }

下面进行状态初始化,定义StateMachine,如果你愿意,可以在状态触发时传递参数。例如,如果你使用Assign触发Bug,可以传入“Scott”,这样该Bug就会进入Assigned状态——分配给Scott。

State _state = State.Open;
StateMachine<State, Trigger> _machine;
StateMachine<State, Trigger>.TriggerWithParameters<string> _assignTrigger;string _title;string _assignee;

在这个例子中,Bug构造函数使用一个流畅接口的状态机,该接口读得相当不错。

public Bug(string title)
{_title = title;_machine = new StateMachine<State, Trigger>(() => _state, s => _state = s);    _assignTrigger = _machine.SetTriggerParameters<string>(Trigger.Assign);    _machine.Configure(State.Open)        .Permit(Trigger.Assign, State.Assigned);  
 _machine.Configure(State.Assigned)        .SubstateOf(State.Open)        .OnEntryFrom(_assignTrigger, assignee => OnAssigned(assignee))        .PermitReentry(Trigger.Assign)        .Permit(Trigger.Close, State.Closed)        .Permit(Trigger.Defer, State.Deferred)        .OnExit(() => OnDeassigned());  
  _machine.Configure(State.Deferred)        .OnEntry(() => _assignee = null)        .Permit(Trigger.Assign, State.Assigned); }

例如,当状态打开时,可以进行分配,但是,由于它是被写入的(你可以改变),所以你无法关闭一个处于开放状态并且没有分配的Bug。

当Bug被分配时,你可以关闭,延迟或重新分配。这是PermitReentry()。另外,注意一下,Assigned是一个子状态。

你可以有状态地改变触发事件,这些事件可以根据您的个人设置采取行动。

void OnAssigned(string assignee)
{    if (_assignee != null && assignee != _assignee)SendEmailToAssignee("Don't forget to help the new employee.");_assignee = assignee;SendEmailToAssignee("You own it.");
}void OnDeassigned()
{SendEmailToAssignee("You're off the hook.");
}void SendEmailToAssignee(string message)
{Console.WriteLine("{0}, RE {1}: {2}", _assignee, _title, message);
}

拥有一个好的状态机库,例如Stateless,可以让你快速地模拟状态。能否分享一下,你在项目中使用的状态机是什么样子的?

原文地址: http://www.hanselman.com/blog/Stateless30AStateMachineLibraryForNETCore.aspx


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327858.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java压缩技术(五) GZIP相关——浏览器解析

转载自 Java压缩技术&#xff08;五&#xff09; GZIP相关——浏览器解析 GZIP本身就是一种网络流压缩算法&#xff0c;而且应用相当广泛。如果网络访问过程中&#xff0c;其数据流较大&#xff0c;势必降低网络访问效率&#xff0c;此时就需要考虑使用压缩&#xff01;当然&…

在实际使用中 mysql所支持的触发器有_2016计算机二级MySQL冲刺题及答案

2016计算机二级MySQL冲刺题及答案11[简答题] 请使用UPDATE语句将数据库db_test的表content中留言人姓名为“MySQL初学者”的留言内容修改为“如何使用INSERT语句?”。参考解析&#xff1a;在MySQL命令行客户端输入如下SQL语句即可实现&#xff1a;mysql>USE db-test;Databa…

[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated c

[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated c 解决MySQL报错&#xff1a;1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column informat [Err] 1055 - Expression #1 of ORDER BY …

在mysql中插入日期

preparedStatement.setDate(5,new Date(new java.util.Date().getTime()));//给第五个占位符&#xff1f; 的值赋值为new Date(new java.util.Date().getTime())&#xff1b; 外面的Date是SQL中的java.sql.*&#xff1b; 里面的Date是java中的java.util.Date&#xff1b;

Hibernate中使用Criteria查询及注解——(HibernateUtil)

HibernateUtil hibernate工具类&#xff1a; package cn.bdqn.hibernate_Criteria.Util;import org.hibernate.Session; import org.hibernate.cfg.Configuration;public class HibernateUtil {private static Session session; …

进程管理supervisor的简单说明

背景&#xff1a; 项目中遇到有些脚本需要通过后台进程运行&#xff0c;保证不被异常中断&#xff0c;之前都是通过nohup、&、screen来实现&#xff0c;带着能否做一个start/stop/restart/reload的服务启动的想法找到里Supervisor。关于supervisor的介绍在网上大致搜索总结…

Java压缩技术(四) GZIP——Java原生实现

转载自 Java压缩技术&#xff08;四&#xff09; GZIP——Java原生实现 GZIP常常用在linxu环境下&#xff0c;是一种非常简单的压缩算法。在Java实现API中&#xff0c;它仅仅包含两个实现类&#xff1a;GZIPInputStream和GZIPOutputStream。 GZIPOutputStream类用于压缩 GZIPI…

数据结构树的基本操作_树的各类基本操作(数据结构)

#include "iostream"/*输入&#xff1a;ABC DE G FABC DE G F*/#include "bits/stdc.h"using namespace std;typedef struct bitnode{char data;bitnode *lchild,*rchild;} *bintree;bintree creatree(bintree &root)//先序创建树{char agetchar();if(…

下载bilibli网站视频

https://www.videofk.com/bilibili-video-download/ bilibili https://www.videofk.com/bilibili-video-download/search?urlhttps%3A%2F%2Fwww.bilibili.com%2Fvideo%2Fav50186988&selectbilibili

处理js乱码

1.将time.js编码格式更改外 2.在Tomcat设置VM-OPTION 选项为-Dfile.encodingutf-8

asp.net core 实战之 redis 负载均衡和quot;高可用quot;实现

1.概述 分布式系统缓存已经变得不可或缺,本文主要阐述如何实现redis主从复制集群的负载均衡,以及 redis的"高可用"实现, 呵呵双引号的"高可用"并不是传统意义的高可用哈,而是 redis集群挂了,并不影响asp.net core 的运行, 欲知详情,请看下文. 注意: 本文主…

Java IO: 其他字符流(下)

转载自 Java IO: 其他字符流(下)作者: Jakob Jenkov 译者: 李璟(jlee381344197gmail.com) 本小节会简要概括Java IO中的PushbackReader&#xff0c;LineNumberReader&#xff0c;StreamTokenizer&#xff0c;PrintWriter&#xff0c;StringReader&#xff0c;StringWriter。P…

java 长字符串 比较_Java字符串比较(3种方法)

字符串比较是常见的操作&#xff0c;包括比较相等、比较大小、比较前缀和后缀串等。在 Java 中&#xff0c;比较字符串的常用方法有 3 个&#xff1a;equals() 方法、equalsIgnoreCase() 方法、 compareTo() 方法。下面详细介绍这 3 个方法的使用。equals() 方法equals() 方法将…

IntelliJ IDEA 项目结构旁边出现 0%methods,0% lines covered 解决

IntelliJ IDEA 项目结构旁边出现 0%methods,0% lines covered 解决 windows 1.选中根目录文件夹 ctrl alt f6弹出如下框,取消勾选-->点击Show Selected就可以去掉了 mac 1.选中根目录文件夹 option fn command f6弹出如下框,取消勾选-->点击Show Select…

javaweb---简易邮件发送

邮件发送 2.jar包的支持 activation-1.1.1.jar mail-1.4.7.jar 3.授权码的获取 4.简易文本邮件发送的实现 由上图我们可以确定几个必须步骤 1.创建session对象 2.创建Transport对象 3.使用邮箱的用户名和授权码连上邮件服务器 4.创建一个Message对象&#xff08;需要传递…

Hibernate中使用Criteria查询及注解——(DeptTest.java)

DeptTest.java 测试类&#xff1a; 先创建Session&#xff1a; private Session session;private Transaction tx;Beforepublic void beforeMethod(){sessionnew Configuration().configure().buildSessionFactory().openSession();}关闭Session&#xff1a; Afterpublic void…

asp.net core 负载均衡集群搭建(centos7+nginx+supervisor+kestrel)

概述 本文目的是搭建三台asp.net core 集群, 并配上 nginx做负载均衡 首先准备要运行的源码 http://pan.baidu.com/s/1c20x0bA 准备三台服务器(或则虚拟机) 192.168.182.129 , 192.168.182.130 , 192.168.182.131 并将源码发布至三台服务器的 /root/aspnetcore/anuoapc 目录 …

Java IO教程

转载自 Java IO教程译文链接 作者&#xff1a;Jakob Jenkov 译者&#xff1a;Connor (cronnorcgmail.com) &#xff0c;李璟 校对&#xff1a;方腾飞 Java IO 是一套Java用来读写数据&#xff08;输入和输出&#xff09;的API。大部分程序都要处理一些输入&#xff0c;并由输…

Java web登录拦截器_SpringMVC拦截器(实现登录验证拦截器)

本例实现登陆时的验证拦截&#xff0c;采用SpringMVC拦截器来实现核心代码首先是index.jsp,显示链接String path request.getContextPath();String basePath request.getScheme()"://"request.getServerName()":"request.getServerPort()path"/&quo…

Java Poi 向excel中插入图片

博客 package com.unicom.yangjiabin.utils;import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import javax.imageio.ImageIO; import org.apache.po…