8.2. ネストされた対話
ネストされた対話は、既存の対話のスコープ内で
@Begin(nested=true) とマークされたメソッドを呼び出すことにより作成されます。 ネストされた対話にはそれ自体の対話コンテキストがありますが、 外側の対話のコンテキストから値を読み取ることができます。外側の対話のコンテキストはネストされた対話内では読み取り専用ですが、オブジェクトは参照により取得されるため、オブジェクト自体への変更はその外側のコンテキストに反映されます。
- 対話をネストするとオリジナルの対話または外側の対話のコンテキストに積み重ねられるコンテキストを初期化します。 外側の対話が親とみなされます。
- ネストされた対話のコンテキストに直接設定されるまたはアウトジェクトされる値はすべて親となる対話のコンテキストでアクセス可能なオブジェクトに影響は与えません。
- 対話コンテキストからのコンテキスト検索やインジェクションはまず現在の対話コンテキストにある値を検索します。値が見付からないと対話がネストされている場合はその対話スタックまで続きます。この動作は上書き可能です。
その後
@End が出てくると、 ネストされた対話は破棄されて外側の対話が開始し、 対話スタックを ポップ します。 対話は任意の深さにネストすることができます。
特定のユーザーアクティビティ (ワークスペース管理や戻るボタン) により、 内側の対話が終了する前に外側の対話が開始されることがあります。 この場合、 同じ外側の対話に属する同時のネストされた対話を複数持つことが可能です。ネストされた対話が終了する前に外側の対話が終了すると、 Seam はネストされた対話コンテキストを外側のコンテキストと共にすべて破棄します。
対話スタックの最下位にある対話がルートの対話です。 この対話を破棄すると派生した対話はすべて常に破棄されます。
@End(root=true) を指定すると宣言的にこれを行うことができます。
対話は 継続可能な状態 と考えることができます。 ネストされた対話により、 ユーザーの操作のさまざまなポイントにおいてアプリケーションは一貫した継続可能な状態を捕らえることができます。 これにより、 戻るボタンを押したときやワークスペースの管理に対して正しく動作するようにします。
前述した通り、 現在ネストされている対話の親となる対話にコンポーネントが存在する場合、このネストされている対話は同じインスタンスを使用します。ネストされるそれぞれの対話内に別々のインスタンスを持たせると、親となる対話のコンポーネントインスタンスがその子となる対話からは見えなくなるため、時には便利な場合があります。これを行うには、コンポーネントに
@PerNestedConversation アノテーションを付けます。