さまざまな実装のベースとして、ライブラリ内の基本的なプログラム状態を持つ Spring ステートマシンを提供します。基本的なステートマシンを使用して現在の実装に応じてカスタム遷移アクションを追加することは、提供されている遷移注釈により簡単に思えます。
ここで、ガードで同様のことを行いたいと考えています。つまり、基本的な statemachine を使用して、実装内の最近の使用シナリオに応じて遷移ガードを提供します。
1 つのアイデアは、デコレータ パターンを実装する基本ステートマシン内にデフォルト ガードを設定することです。つまり、別のガードをラップするガード インターフェースを実装するラッパーです。デフォルトのガード ラップとして、evaluate メソッドに対して常に true を返す単純なガード実装が使用されます。
コードスニペットは次のようになります...最初にガード:
import org.springframework.statemachine.StateContext;
import org.springframework.statemachine.guard.Guard;
// ... custom States and Events imports
public class GuardDecorator implements Guard<States, Events> {
private Guard<States, Events> guard;
public GuardDecorator() {
this.guard = new DefaultGuard();
}
public GuardDecorator(Guard<States, Events> guard) {
this.guard = guard;
}
public void setGuard(Guard<States, Events> guard) {
this.guard = guard;
}
public String wrappedGuardInfo() {
return this.guard.toString();
}
@Override
public boolean evaluate(StateContext<States, Events> context) {
return this.guard.evaluate(context);
}
}
public class DefaultGuard implements Guard<States, Events> {
@Override
public boolean evaluate(StateContext<States, Events> context) {
return true;
}
}
statemachine 設定ツールで GuardDecorator を使用するようになりました (抜粋のみ):
// ...
@Bean
public GuardDecorator guard() {
return new GuardDecorator();
}
// ...
@Override
public void configure(
StateMachineTransitionConfigurer<States, Events> transitions)
throws Exception {
transitions.withExternal()
.source(States.S1)
.target(States.S2)
.event(Events.E1)
.guard(guard());
}
// ...
私の質問は今:
- ドキュメントで何かを見逃していましたか?これを行うための組み込みの方法はありますか?
- ライブラリ内で提供される基本的なステートマシンの実装依存ガードを取得する他のソリューションはありますか?