13

C# ステートレス ライブラリを使用する場合、人々はコードをどのように構成しますか?

https://github.com/nblumhardt/stateless

これが注入された依存関係とどのように結びついているか、責任と階層化の正しいアプローチに特に興味があります。

私の現在の構造は次のとおりです。

public class AccountWf
{
    private readonly AspNetUser aspNetUser;

    private enum State { Unverified, VerificationRequestSent, Verfied, Registered }
    private enum Trigger { VerificationRequest, VerificationComplete, RegistrationComplete }

    private readonly StateMachine<State, Trigger> machine;

    public AccountWf(AspNetUser aspNetUser, AccountWfService userAccountWfService)
    {
        this.aspNetUser = aspNetUser;

        if (aspNetUser.WorkflowState == null)
        {
            aspNetUser.WorkflowState = State.Unverified.ToString();
        }

        machine = new StateMachine<State, Trigger>(
        () => (State)Enum.Parse(typeof(State), aspNetUser.WorkflowState),
        s => aspNetUser.WorkflowState = s.ToString()
        );

        machine.Configure(State.Unverified)
        .Permit(Trigger.VerificationRequest, State.VerificationRequestSent);

        machine.Configure(State.VerificationRequestSent)
        .OnEntry(() => userAccountWfService.SendVerificationRequest(aspNetUser))
        .PermitReentry(Trigger.VerificationRequest)
        .Permit(Trigger.VerificationComplete, State.Verfied);

        machine.Configure(State.Verfied)
        .Permit(Trigger.RegistrationComplete, State.Registered);

    }

    public void VerificationRequest()
    {
        machine.Fire(Trigger.VerificationRequest);
    }

    public void VerificationComplete()
    {
        machine.Fire(Trigger.VerificationComplete);
    }

    public void RegistrationComplete()
    {
        machine.Fire(Trigger.RegistrationComplete);
    }

}

OnEntry フック内ですべてのプロセス (サービスへの呼び出し) を実装する必要がありますか、それとも、状態遷移が許可されていることが確認された後に、外部でプロセスを実装する必要がありますか? もしそうなら、トランザクション管理をどのように行うのだろうか。

私が求めているのは、ステートレスを使用して何かを既に実装している人からの最良のガイダンスと、コード構造へのアプローチ方法だと思います。

4

1 に答える 1

12

構造自体に対処する前に、いくつかの注意事項があります。

  • OnEntryアクションは、トリガーが正常に起動された場合にのみ実行されます。

  • 現在の状態で許可されていないトリガーを起動すると、InvalidOperationException. 例外が予想されない場合は、オーバーライドを検討OnUnhandledTriggerしてください (未処理のトリガーをログに記録することは、ロジックの欠陥を見つける良い方法であることがわかりました)。

OnEntry/構造化に関する私の経験則は、OnExit作成とロジックが配置されOnEntry、必要なクリーンアップが行われるということOnExitです。

したがって、あなたの場合、注入された依存関係を使用している場合 (そして、それらの所有権を取得していない、つまり、他の誰かがライフサイクルを管理すると仮定した場合)、すべてのロジックを配置できますOnEntry

それを念頭に置いて、ステート マシンが現在構造化されている方法はまったく問題ありません。

最後に、ステート マシンを進めてステート マシン ロジックを実行している同じスレッド内からトリガーを起動すると、stackoverflow 例外が発生する可能性があることに注意してください (自動進行の問題を解決する方法については、こちらを参照してください)。

于 2014-10-15T09:11:47.397 に答える