ステートマシンを使用できる場合は、StateLess by Nicholas Blumhardt (Autofaq creator)というオープンソースプロジェクトをお勧めします。彼のアプローチは、状態が文字列やintのような単純な変数によって定義されるため、ランタイムエンジンによって保持されている長時間実行されるワークフローの問題を回避します。ここで
はサンプル状態マシンである:
var phoneCall = new StateMachine<State, Trigger>(State.OffHook);
phoneCall.Configure(State.OffHook)
.Permit(Trigger.CallDialed, State.Ringing);
phoneCall.Configure(State.Ringing)
.Permit(Trigger.HungUp, State.OffHook)
.Permit(Trigger.CallConnected, State.Connected);
phoneCall.Configure(State.Connected)
.OnEntry(() => StartCallTimer())
.OnExit(() => StopCallTimer())
.Permit(Trigger.LeftMessage, State.OffHook)
.Permit(Trigger.HungUp, State.OffHook)
.Permit(Trigger.PlacedOnHold, State.OnHold);
// ...
phoneCall.Fire(Trigger.CallDialled);
Assert.AreEqual(State.Ringing, phoneCall.State);
あなたの状態は、データベースからそれを現在の状態を供給することを可能にする整数を指定できます。これは、次のようにステートマシンのコンストラクタで設定することができます。
var stateMachine = new StateMachine<State, Trigger>(
() => myState.Value,
s => myState.Value = s);
あなたがWindowsワークフローを実行する必要があり、複数のプロジェクトに比べて、一つだけのアセンブリでこれを実装することができます。メンテナンスは非常に低く、あなたのためのコードを生成する "デザイナー"はありません。また、シンプルであり、美しさがあります。
+1のコードサンプル。 – georgiosd