.NET 状态机Automatonymous快速入门
介紹
Automatonymous是.NET開發(fā)人員的狀態(tài)機(jī)庫。它提供了一種流暢的語法來聲明狀態(tài)機(jī),包括狀態(tài),事件(支持觸發(fā)器和數(shù)據(jù)事件)以及狀態(tài)/事件活動(dòng)。盡管Automatonymous在簡(jiǎn)單的狀態(tài)機(jī)上非常容易使用,但它具有許多高級(jí)功能,使它可以在各種上下文中使用。
快速入門
跟隨官網(wǎng)提供的快速入門demo,定義了一個(gè)關(guān)系狀態(tài)機(jī),關(guān)系狀態(tài)有兩種:Friend(朋友-友好)、Enemy(敵人-敵意),三個(gè)可以引發(fā)的事件:Hello(打招呼)、PissOff(走開)、Introduce(自我介紹)。打招呼->友好、走開->敵意、自我介紹->友好狀態(tài)。
創(chuàng)建一個(gè)控制臺(tái)應(yīng)用程序,然后安裝Automatonymous
我們創(chuàng)建兩個(gè)類,一個(gè)類表示狀態(tài)(Relationship),另一個(gè)類定義狀態(tài)的行為(RelationshipStateMachine),代碼如下:
/// /// 狀態(tài)類/// public class Relationship{public State CurrentState { get; set; }public string Name { get; set; }}/// /// 狀態(tài)機(jī)/// 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(){//定義當(dāng)前 狀態(tài)屬性 InstanceState(x => x.CurrentState);//定義事件Event(() => Hello);Event(() => PissOff);Event(() => Introduce);// 定義狀態(tài)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},這是狀態(tài)機(jī)簡(jiǎn)單入門篇");}).TransitionTo(Friend).Finalize());}}/// /// 事件數(shù)據(jù)/// public class Person{public string Name { get; set; }}小結(jié):在Automatonymous中 ,狀態(tài)是使用類進(jìn)行管理的,如上面的Relationship。狀態(tài)機(jī)行為類定義需要繼承行為類需要繼續(xù)AutomatonymousStateMachine類,它是泛型類,需指定與行為關(guān)聯(lián)的狀態(tài)類型如AutomatonymousStateMachine。默認(rèn)情況下,事件或狀態(tài)的所有公共屬性都將在基類的構(gòu)造函數(shù)中自動(dòng)定義和初始化。在構(gòu)造函數(shù)中使用lambda方法Event和state方法明確地定義事件和狀態(tài)。
客戶端引發(fā)事件
支持事件無數(shù)據(jù)和有數(shù)據(jù)兩種方式,代碼如下:
static void Main(string[] args){var relationship = new Relationship();var machine = new RelationshipStateMachine();//machine.RaiseEvent(relationship, machine.Hello); 無數(shù)據(jù)var person = new Person { Name = "知音" };machine.RaiseEvent(relationship, machine.Introduce, person);//指定事件需要的數(shù)據(jù)}輸出
?
總結(jié)
以上是生活随笔為你收集整理的.NET 状态机Automatonymous快速入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Azure学习.01】先从账号注册开始
- 下一篇: Asp.Net Core下的开源任务调度