19

かなり単純な状態のニーズがいくつかあります (今のところ)。Stateless apiを使用してこれらをモデル化したいと思います。(しかし、私はステート マシンについてあまり詳しくないので、間違っている可能性があります。)

しかし、私は用語(具体的にはStateTrigger)に巻き込まれています

例を次に示します。注文クラスがあります。いくつかの状態でセットアップされます。それらは次のとおりです:新規、充填済み、出荷中、完了済み、キャンセル済み。

私が望むいくつかの単純な状態ルールは、これらの状態遷移が許可されることです。

  • 新規 (デフォルト)
  • 新規 -> 記入済み
  • 新規 -> キャンセル
  • 発送済み -> 配送中
  • 記入済み -> キャンセル済み
  • 発送済み -> 配送中
  • 発送→完了

ここでつまずいたのは、私の「トリガー」とは何ですか?

より具体的な例が必要な場合に備えて、次のようなメソッドが必要だとします。

public bool UpdateOrderStatus(int OrderId, OrderStatusEnum NewOrderStatus)

ステータスが正常に更新された場合は true を返します。これを実現するためにステートレスをどのようにセットアップして使用できますか?

4

1 に答える 1

31

マシンは一度に 1 つの状態になります。ある時点での状態は、現在の状態と呼ばれます。トリガーイベントまたは条件によって開始されると、ある状態から別の状態に変化する可能性があり、これは遷移と呼ばれます。 Wiki の有限状態マシンより

トリガーはこのトリガーイベントだと思います。

アップデート:

もちろん、トリガー名は状態名と同じ場合もあります。

New (initial state)
New -> Filled (trigger "Filled")
New -> Cancelled (trigger "Cancelled")
Filled -> Shipping (trigger "ToBeShipped")
Filled -> Cancelled (trigger "Cancelled")
Shipping -> Complete (trigger "Completed").

アップデート:

ステートレスは本当に素晴らしいフレームワークです! 機能を実装しようとしました。

州:

public enum State
{
    New,
    Filled,
    Shipping,
    Cancelled,
    Completed
}

トリガー:

public enum Trigger
{
    Filled,
    Cancelled,
    ToBeShipped,
    Completed
}

注文クラス:

public class Order
{
    private readonly StateMachine<State, Trigger> _stateMachine;

    public Order()
    {
        _stateMachine = CreateStateMachine();
    }

    public bool TryUpdateOrderStatus(Trigger trigger)
    {
        if (!_stateMachine.CanFire(trigger))
            return false;

        _stateMachine.Fire(trigger);
        return true;
    }

    public State Status
    {
        get
        {
            return _stateMachine.State;
        }
    }

    private StateMachine<State, Trigger> CreateStateMachine()
    {
        StateMachine<State, Trigger> stateMachine = new StateMachine<State, Trigger>(State.New);
        stateMachine.Configure(State.New)
            .Permit(Trigger.Filled, State.Filled)
            .Permit(Trigger.Cancelled, State.Cancelled);

        stateMachine.Configure(State.Filled)
            .Permit(Trigger.ToBeShipped, State.Shipping)
            .Permit(Trigger.Cancelled, State.Cancelled);

        stateMachine.Configure(State.Shipping)
            .Permit(Trigger.Completed, State.Completed);

        stateMachine.OnUnhandledTrigger((state, trigger) =>
            {
                Console.WriteLine("Unhandled: '{0}' state, '{1}' trigger!");
            });
        return stateMachine;
    }
}

注文クラスのテスター:

Order order = new Order();
bool result = order.TryUpdateOrderStatus(Trigger.Completed);
Console.WriteLine("Attemp to complete order: {0}", result);
Console.WriteLine("Order status: {0}", order.Status);

result = order.TryUpdateOrderStatus(Trigger.ToBeShipped);
Console.WriteLine("Attemp to ship order: {0}", result);
Console.WriteLine("Order status: {0}", order.Status);

result = order.TryUpdateOrderStatus(Trigger.Cancelled);
Console.WriteLine("Attemp to cancel order: {0}", result);
Console.WriteLine("Order status: {0}", order.Status);
于 2012-02-02T18:16:31.357 に答える