阅读更多

0顶
0踩

开源软件
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,可以让你快速地模拟状态。能否分享一下,你在项目中使用的状态机是什么样子的?

原文:Stateless 3.0 - A State Machine library for .NET Core
作者:Scott Hanselman 翻译:Daisy 责编:仲培艺
0
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • apache_2.0.50-win32

    apache_2.0.50版本。如果您需要,就下了吧。呵呵

  • apache_2.0.50-win32-x86-no_ssl.exe

    apache_2.0.50-win32-x86-no_ssl.exe

  • Apeaksoft.Android.Toolkit.2.0.50.rar

    解压密码:123 安装说明:https://blog.csdn.net/hongfu951/article/details/118517942  Apeaksoft Android Toolkit是一款Android数据恢复软件,用于Android智能手机和平板电脑的删除文件。Apeaksoft Android数据恢复可以帮助您恢复从您的Android手机,平板电脑和SD卡中删除或丢失的照片,视频,联系人,消息,通话记录,应用程序和文档。它与5000多款Android便携式设备兼容。

  • apache_2.0.50-win32-x86-no_ssl.msi

    apache_2.0.50-win32-x86-no_ssl.msi

  • Enviro-Sky and Weather 2.0.50 unity 天气系统

    Enviro-Sky and Weather 2.0.50 unity 天气系统

  • ASP.NET资源大全

    NancyFx:轻量、用于构建 HTTP 基础服务的非正式(low-ceremony)框架,基于.Net 及 Mono 平台。 ASP.NET WebAPI:快捷创建 HTTP 服务的框架,可以广泛用于多种不同的客户端,包括浏览器和移动设备 ServiceStack:...

  • .NET平台框架整理(1)

    NancyFx:轻量、用于构建 HTTP 基础服务的非正式(low-ceremony)框架,基于.Net 及 Mono 平台。官网 ASP.NET WebAPI:快捷创建 HTTP 服务的框架,可以广泛用于多种不同的客户端,包括浏览器和移动设备。官网 ...

  • .NET方面的框架的整理和总结

    自从学习.NET以来,优雅的编程风格,极度简单的可扩展性,足够强大开发工具,极小的学习曲线,让我对这个平台产生了浓厚的兴趣,在工作和学习中也积累了一些开源的组件,就目前想到的先整理于此,如果再想到,就继续...

  • .Net开源框架列表

    NancyFx:轻量、用于构建 HTTP 基础服务的非正式(low-ceremony)框架,基于.Net 及 Mono 平台。官网 ASP.NET WebAPI:快捷创建 HTTP 服务的框架,可以广泛用于多种不同的客户端,包括浏览器和移动设备。官网 ...

  • 用apache2.2发布ASP.NET3.5

    一、Apache支持ASP.NET简要说明:1、所用到的软件:  (1)apache安装包:httpd-2.2.15-win32-x86-no_ssl.msi  下载地址: http://httpd.apache.org/download.cgi#apache22  (2)mod_aspdotnet安裝包:mod_aspdotnet-2.2.0.2006-setup-r2.msi 下载

  • Apache httpd 学习总结

    以下所总结仅是学习记录,如有不对的部分,还请及时指出,十分感谢 参考文档目录都在末尾写出了作者的链接,有兴趣的可以直接点击 文章有点长,建议收藏后查看 Apache httpd 简介 Apache HTTPD又可以简称为httpd或者Apache,它是Internet使用最广泛的web服务器之一,使用Apache提供的web服务器是由守护进程httpd,通过http协议进行文本传输,默认使用80端口的明文传输方式,当然,后来,为了保证数据的安全和可靠性,又添加了443的加密传输的方式,Apache提供的服务

  • Apache 2.0.50 Released

    Apache 2.0.50发布,这个版本包括一些重要的安全更新以及bug修正. 点这里 查看详细信息.以及2.0.50的变动清单

  • mysql 4.0.20 下载_redhat 9下配置APACHE2.0.50 +PHP5+MYSQL4.0.20+GD库

    apache|mysql|php5linux下配置APACHE2.0.50+PHP5.0.3+MYSQL4.0.20+GD库前些天,升级服务器的时候,因为GD库的原因.make不了PHP4.3.8 于是就一步步装了PHP5其实,安装步骤和PHP4只差一点点而已如果你机器里原来装有了PHP或者APACHE的RPM或者低版本.请先删除首先,服务器GCC要有,不然什么都不能做.可以用gcc -v来查看是...

  • ASP.NET资源大全-知识分享

    ASP.NET资源大全-知识分享 API 框架 NancyFx:轻量、用于构建 HTTP 基础服务的非正式(low-ceremony)框架,基于.Net 及 Mono 平台。官网 ASP.NET WebAPI:快捷创建 HTTP 服务的框架,可以广泛用于...

  • ASP.NET资源大全-知识分享 【转载】

    NancyFx:轻量、用于构建 HTTP 基础服务的非正式(low-ceremony)框架,基于.Net 及 Mono 平台。官网 ASP.NET WebAPI:快捷创建 HTTP 服务的框架,可以广泛用于多种不同的客户端,包括浏览器和移动设备。官网 ...

  • .Net开源框架列表【转载】

    NancyFx:轻量、用于构建 HTTP 基础服务的非正式(low-ceremony)框架,基于.Net 及 Mono 平台。官网 ASP.NET WebAPI:快捷创建 HTTP 服务的框架,可以广泛用于多种不同的客户端,包括浏览器和移动设备。官网 ...

  • .Net 开源项目资源大全

    伯乐在线已在 GitHub 上发起「DotNet 资源大全中文版」的整理。欢迎扩散、欢迎加入。 https://github.com/jobbole/awesome-dotnet-cn (注:下面用 [$]标注的表示收费工具,但部分收费工具针对开源软件的开发/...

  • MD5 加密已被破解

    密码学领域重大发现:山东大学王小云教授成功破解MD5 密码学领域重大发现:山东大学王小云教授成功破解MD52004-09-04 09:39   [本站讯]2004年8月17日的美国加州圣巴巴拉,正在召开的国际密码学会议(Crypto’2004)安排了三场关于杂凑函数的特别报告。在国际著名密码学家Eli Biham和Antoine Joux相继做了对SHA-1的分析与给出S

  • Zend Studio 3.5 - Officially Released!

      这是我极力推荐的 PHP IDE,3.5版本完全支持 PHP5 ,现在发布了稳定版本,最新功能如下:Powerful Features:DevelopNEW - PHP 5 Support Advanced Code Completion NEW - Code Templates Real-time Code Recognition Syntax Code Hi

Global site tag (gtag.js) - Google Analytics