.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);//指定事件需要的数据
         
        }

输出

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值