阅读更多

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 条 请登录后发表评论

发表评论

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

相关推荐

  • 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 服务的框架,可以广泛用于多种不同的客户端,包括浏览器和移动设备。官网 ...

  • 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

  • PHP 5.0.1 中 GD2.0.28 支持创建 GIF 图像了[附一个图片验证程序]

      PHP 5.0.1 中 GD2.0.28 支持创建 GIF 图像了,我测试了下,确实如此。附上我写的一个图片验证代码,我乱封装成Class了,其实用function就可以了。自己修改吧,呵呵。    /**     * @author  ShenKong shenkong@openphp.cn>     * @version $id     * @package SPB Forum

  • MySQL 4.0.21 发布 [Smarty / SQLite 也发布了新版本]

      MySQL 4.0.21 发布,修正了好多 BUG,建议更新到此版本。  具体更新信息:http://lists.mysql.com/announce/217  For Windows 版本:官方下载   其他版本下载地址:http://dev.mysql.com/downloads/mysql/4.0.htmlSmarty 2.6.4 Released  下载:http:

  • MySQL 5.0.1 Alpha 发布

    昨天,MySQL 5.0.1 Alpha 发布,包含很多新特性,详情请看 Changelog 。下载:http://dev.mysql.com/downloads/mysql/5.0.1-snapshot.htmlNews from the ChangeLog:   Functionality added or changed:     * Added support of read on

  • PHP&More第二期发布

    PHP&More第二期发布作者 phpmore  来源 www.phpmore.com  2004-08-25     当前版本 2004.08.25.18.00    在下载前请先阅读我们使用的创作共用协议     封面  下载 [ pdf | zip ]   反馈及意见 代码  

  • PHP 4.3.9RC1 released!

      PHP4 又发布了新版本,不过是候选版本,修正了很多BUG,更新也不少。  下载:http://qa.php.net/+11 Aug 2004, Version 4.3.9RC1重写帮助文件+- Rewritten UNIX and Windows install help files. (Documentation Team)更新了PCRE支持更好的错误处理+- Update

  • PHP 4.3.9RC2 released!

      PHP 4.3.9RC2 released!   没什么可说的了,PHP4 好像就是只剩下修正 Bug 了,功能提升应该留给 PHP5 了。没看到什么好玩的东西,呵呵。  更新信息:NEWS  下载:QA   By the way:SQLite 3.0.5(beta) 前几天也发布了,3.0版本是个测试版本。

  • SQLite Version 3.0.3 (beta) 和 2.8.15 发布

    2004-Jly-22 - Version 3.0.3 (beta) The second beta release of SQLite version 3.0 is now available. This new beta fixes many bugs and adds support for databases with varying page sizes. The next 3.0 re

  • PHP 5.0.1 Released!

     PHP 5.0.1 发布了,上次可是眺票了,推迟到这周才发布,这次主要是修正BUG,一堆.更新信息:ChangeLog下载:Downloads

  • 来自Zend:PHP5.0.1这周内即将发布

      刚看到Zend站点更新,PHP5.0.1即将在这周内发布,修正一些Bug,并提供PHP 5 windows installer 。详情请点击这里查看

Global site tag (gtag.js) - Google Analytics