.NET 状态机Automatonymous快速入门
介紹
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快速入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Azure学习.01】先从账号注册开始
- 下一篇: Asp.Net Core下的开源任务调度