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

YOKOTA Takehiko takehiko
2005年 6月 1日 (水) 11:51:28 JST


横田です。

Koichi Kobayashi wrote:

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

ありがとうございます。実は小林さんの日記(とまさたかさんの日記)を拝見し
た上での質問だったのです。

それで、まさたかさんの日記
http://d.hatena.ne.jp/masataka_k/20040322#p2
を読んだ感じでは、「instanceMode="outer" があるから injectDependency があ
る」というよりは、両方が同時に設けられたという印象を受けました。

ただ、印象はともかくこの機能を追加したのが小林さんなのであれば
「instanceMode="outer"があるから injectDependency がある」ということは事実
ということで話を進めると、次の疑問が沸きました。すなわち、instanceMode="outer"
の、injectDependencyを使わないケースでの存在意義とは何か、ということです。

injectDependency()がおっしゃるように「後づけ」であるならば、当然instanceMode="outer"
には元々の存在意義があるはずですが、それが何なのか分かりません。(逆に、
仮にinstanceMode="outer"の元々の存在意義がないのであれば、少なくとも
instanceMode="outer"はinjectDepencency()があってこそ意味を成すことになり、
「instanceMode="outer"があるから injectDependency がある」とは言えないと
思います。)

>>具体的なケースとして、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);
> 
> って感じではないかと.

なるほど、こういうことができるのですね。参考になります。ちなみにこのあたり
を解説した資料をご存知であればぜひ教えていただければ助かります。(今S2を
使ったフレームワークを作っているのですが、結構ディープな使い方をしたいと
思っていますので…。)

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

instanceMode="outer"がある方が効率が上がるのは理解できましたが、それが
「instanceMode="outer"がないコンポーネントはinjectDependency()できない」
に結びつくところが良くわかりませんでした。instanceMode="outer"がないコン
ポーネをinjectDependency()すると遅いがinstanceMode="outer"があるコンポー
ネントをinjectDependency()するのは早い、というような実装にはできないの
でしょうか。(S2の仕組みを知らないので無理を言っているのかもしれません。)

> 個人的には「効率の悪い使い方が簡単にできるデザインはよくない」と
> 考えていますので,現在の S2 の API は妥当なものだと思ってます.

この場合「効率の悪い使い方が簡単にできる」とは、仮にinstanceMode="outer"
なしでもinjectDependency()できるようにすると、instanceMode="outer"エント
リを用意できるようなコンポーネントに対してもエントリを用意せずに
injectDependency()され得るから、効率が悪くなり得る、ということでしょうか。

おっしゃることは分かりますが、今回のケースでは効率を良くするために機能を
制限しているわけで、それが必ずしも良いかというとそうでないと自分は思いま
す。今回のケースで言えば、instanceMode="outer"を用意できないコンポーネン
トに対してinjectDependency()相当の処理をする手段を用意すればその手段はど
うしてもinstanceMode="outer"を用意できるコンポーネントに対しても適用可能
なわけで、そうするとinstanceMode="outer"を用意できないコンポーネントに対
してinjectDependency()相当の処理をするニーズがどのくらい多かったとしても
「それはS2側で用意しないから外でやってね」ということになってしまいます。

ただ、ポリシーの違いはもちろんあるでしょうから、それがS2の方針だというの
であれば小林さんが教えてくださった「ComponentDefをregisterする」というや
り方を採用したいと思います。

ありがとうございました。

-- 
YOKOTA Takehiko
  [E-MAIL ADDRESS DELETED]



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