[Seasar-user:2052] Re: injectDependencyについて
Masataka Kurihara
kurihara
2005年 6月 1日 (水) 00:20:52 JST
栗原です。
> > 具体的なケースとして、S2が管理するコンポーネント群に依存するコンポーネ
> > ント群がありまして、それらにS2管理下のコンポーネントをinjectしたいので
> > すが、上記の仕様からinjectDependency()を使用できません。なおS2管理下で
> > ない方のコンポーネントとして何があるかはdiconファイルを書く時点では分
> > からないため、予めinstance="outer"なcomponentエントリを用意しておくこ
> > とはできません。
>
> なるほど、気がつかなかった。。。定義が無くても、プロパティの
> 自動インジェクションだけは動いてもいい気がしますね。プロパティ型
> のインターフェイスをキーにして、引けるコンポーネントをかき集めるのは、
> たしかに便利だと思います。
思い出しました。確かどっかで議論してたかと思います。なんで、これを
やらなかったのかは、コンテナでやらずとも、そのオブジェクトのプロパテ
ィディスクリプタをクルクルまわす中でS2からコンポーネントをとってくる
外部コードでもできるからです。
が、一歩進めるとコンテナの中でやる意味があるかもしれません。
1:Beanタイプ
-set***(Interface型)というプロパティのとき、
-プロパティ型をキーにしてS2コンポーネントを取り出す
-取得できたとき、プロパティに設定(ここまでは今の仕様!)
-TooManyのとき、TooMany例外オブジェクトが持ってる重複コンポーネント
定義のうち、プロパティ名のものを抽出。一個なら、プロパティに設定
-型も名前もかぶっていたら、TooMany例外
2:Beanタイプの配列型
-set***(Interface型[])という配列型プロパティのとき、
-要素型でS2コンポーネントを取り出す
-取得できたら、1個のときは長さ1の配列にして突っ込む
-TooManyのとき、重複コンポーネントを全部取得して配列にして突っ込む。
3:Listタイプ
-add***(Interface型) というpublicメソッドがあったとき、
-メソッド引数型でS2コンポーネントを取り出す。
-取得できたとき、メソッド引数にしてfire
-TooManyのとき、重複コンポーネントを全部繰り返し突っ込む
4:Mapタイプ
-put***(String, Interface型)というpublicメソッドがあったとき、
-メソッド引数型でS2コンポーネントを取り出す。
-取得できたとき、名前も取得。あれば、二つをメソッド引数にしてfire
-TooManyのとき、重複コンポーネントを全部繰り返し名前取得して突っ込む
しかも、これらはDiconで明示でも、自動でも、outerでもそうでなくても、
いつでもできるといいですね。特に1:および2:は、initMethodとか
componentとかの自動argなどでもできるとGood。
これはかなり根性あるDIコンテナといえましょう(笑。最近、ウォッチ
してないのですが、こういうことできるコンテナってあるのかな?
Seasar-user メーリングリストの案内