百度的网站关键词被篡改,网站开发 模块化,php 社交网站模板源码,广告公司怎么取名Stateless是一个基于C##xff0c;创建状态机的简单库#xff0c;最新版本支持.NET Core 1.0。其实现方式并不是通过.NET Core#xff0c;而是通过写入.NET Standard实现的。就像Android平台上API级别抽象出许多底层版本的Android#xff0c;.NET Standard是一组所有.NET平… 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;
StateMachineState, Trigger _machine;
StateMachineState, Trigger.TriggerWithParametersstring _assignTrigger;string _title;string _assignee; 在这个例子中Bug构造函数使用一个流畅接口的状态机该接口读得相当不错。 public Bug(string title)
{_title title;_machine new StateMachineState, Trigger(() _state, s _state s); _assignTrigger _machine.SetTriggerParametersstring(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(Dont forget to help the new employee.);_assignee assignee;SendEmailToAssignee(You own it.);
}void OnDeassigned()
{SendEmailToAssignee(Youre 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跨平台或扫描二维码关注