2010年07月15日

外部バインディング

ここ最近、悩んでいたことでS2Containerで管理しているコンポーネントにて、
DIされる内容を制御したいと考えていた。

まず思いついたのが、コンポーネントのライフサイクルはSessionなので、
明示的にセッションの内容を上書きすれば、次からDIされるのは、設定した値になると考えた。

早速、試してみたがどうも思った挙動にならない。なるような、ならないような。。
今思えば、別の原因だったのかもしれないが、とりあえずこの方法は断念した。

次に試したのが、コンポーネントのライフサイクルをouterにすることだ。
独自に生成したオブジェクトをDIできるのはいいのだけど、その後、処理した結果を
取得したい場合に、getComponent()できないのが都合が悪く断念した。

次に、コンストラクタインジェクションやら、メソッドインジェクションなど模索してみたが、
望み通りの挙動を得ることが難しかった。

次に、ソースを追っかけて、DIしているところをオーバーライド出来ないか模索したが、
よく分からん。。。

なので、S2Containerでの管理を諦めて、インターセプターとFieldクラスを利用して独自のDIもどきを作成した。

でも、フィールドはpublicにしないといけないし、何かスマートでないし、こんな方法で本当にいいのか
悩んで、もう一度調べなおした。

そこで、一度目にしたけど意味が分からなかった、外部バインディング(=externalBinding)を
再度調べてみた。

そもそも外部コンテキストってなんだ?ってところからだ。
どうも、requestとかsessionようだ。

要は、ExternalContextあるプロパティとcomponentにあるプロパティで、同じものがあれば設定してくれるようだ。

じゃあ、一番最初の方法で良かったのか?ただ、externalBinding 属性をtrueにするだけだったのか?
試してみると、うまく行ってるように見えたけど、何か違う気もする。

そもそも、ExternalContextのプロパティってAPサーバーから提供されるオブジェクトらしいが、それってrequestやsessionそのもののことで、その中身に格納されてるプロパティのことじゃないのかな?


ここ数日ずっと悩んでいるけど、有効な解決策が見つからず。。。
別段、そんなに大したことをしたいわけじゃないのだけどなぁ。

そもそも、SAStrutsを使ってはいるけど、S2Containerのみでの利用経験はないし、
DIの仕組みやら何やらあまり理解せずに使ってきたのが悪かったのだろう。

今回悩んだことで、S2Container自体の理解がちょっとだけ深まったから良しとしよう。


posted by hana at 20:58| Comment(0) | TrackBack(0) | seasar関連 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。