Stateless 3.0——.NET Core上のステータスライブラリ

5053 ワード

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を使用した単純なステートマシンの作成
    コードの例をいくつか見てみましょう.まず、開発のように、列挙タイプや状態を変更するための有限な「トリガ」などの有限状態について説明し、状態を起動および停止し、トリガの切り替えを行う.
    もう1つのより実用的な例は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;
    StateMachine _machine;
    StateMachine.TriggerWithParameters<string> _assignTrigger;
    
    string _title;
    string _assignee;

    この例では、Bugコンストラクション関数は、かなりよく読まれているスムーズなインタフェースのステータスマシンを使用します.
    public Bug(string title)
    {
        _title = title;
    
        _machine = new StateMachine(() => _state, s => _state = s);
    
        _assignTrigger = _machine.SetTriggerParameters<string>(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("Don't forget to help the new employee.");
    
        _assignee = assignee;
        SendEmailToAssignee("You own it.");
    }
    
    void OnDeassigned()
    {
        SendEmailToAssignee("You're off the hook.");
    }
    
    void SendEmailToAssignee(string message)
    {
        Console.WriteLine("{0}, RE {1}: {2}", _assignee, _title, message);
    }

    Statelessなどの良いステータスライブラリを持つことで、ステータスを迅速にシミュレートできます.プロジェクトで使用しているステータスマシンはどのようなものですか?
    原文:Stateless 3.0-A State Machine library for.NET Core作者:Scott Hanselman翻訳:Daisy責任編:仲培芸