[Seasar-user:2053] Re: injectDependencyについて

Koichi Kobayashi koichik
2005年 6月 1日 (水) 00:40:19 JST


小林 (koichik) です.

On Tue, 31 May 2005 19:49:31 +0900
YOKOTA Takehiko <[E-MAIL ADDRESS DELETED]> wrote:

> 現在の仕様ではdiconファイルにinstance="outer"であるようなcomponentエン
> トリがないコンポーネントに対してinjectDependency()を呼ぶことはできませ
> んが、これはなぜなのでしょうか。

injectDependency の用途は instanceMode="outer" として定義された
コンポーネントに DI することだから.そのまんまやん.答になってない.(^^;
えと,injectDependency があるから instanceMode="outer" があるのではなく,
instanceMode="outer" があるから injectDependency があるということです.
ということを日記に書いたことがあるのでこちらも参照してください.

http://d.hatena.ne.jp/koichik/20050506#1115412011

コメント欄で klove さんも横田さんと同じような感想を書いておられます.(^^;

> 具体的なケースとして、S2が管理するコンポーネント群に依存するコンポーネ
> ント群がありまして、それらにS2管理下のコンポーネントをinjectしたいので
> すが、上記の仕様からinjectDependency()を使用できません。なおS2管理下で
> ない方のコンポーネントとして何があるかはdiconファイルを書く時点では分
> からないため、予めinstance="outer"なcomponentエントリを用意しておくこ
> とはできません。

これは register() で可能だと思います.
もしインスタンス生成を S2 に任せられるのなら

container.register(clazz, name);

とやっておいて,DI が必要になる度

Foo foo = (Foo) container.getComponent(name);

という感じ.
インスタンス生成を S2 の外でやらなきゃいけないのなら
instanceMode を outer にしないといけないので,

ComponentDefImpl cd = new ComponentDefImpl(clazz, name);
cd.setInstanceMode("outer");
container.register(cd);

とやっておいて,後は DI が必要になる度

container.injectDependency(object, name);

って感じではないかと.
# メーラで直接書いただけなので雰囲気のみって事で.

> 任意のオブジェクトに対してdiconファイル中にあるコンポーネントを注入で
> きると便利な気がするのですが、もしもそうできない或いはそうしていない
> 理由がありましたら教えていただければ幸いです。

おそらく効率の問題でしょうね.
DI するためにはリフレクションを伴う処理が必要になります.
これは決して軽いものではないと思います.
# プロファイルしたわけじゃないから意外と軽いのかもしれませんが.
このような処理を何度も繰り返すのは望ましくないため,重い処理は
register(),その後の軽い処理は getComponent()/injectDependency() に
なっているのだと思います.

横田さんの意図している使い方が 1回の register() ごとに 1 回の
injectDependency() になるような場合 (Singleton 相当) には,
このような API デザインは面倒さが目立つかもしれませんが,
1 回の register() で複数回の injectDependency() になるような場合も
あるわけです.
個人的には「効率の悪い使い方が簡単にできるデザインはよくない」と
考えていますので,現在の S2 の API は妥当なものだと思ってます.


-- 
<signature>
    <name>Koichi Kobayashi</name>
    <e-mail>[E-MAIL ADDRESS DELETED]</e-mail>
</signature>




Seasar-user メーリングリストの案内