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

Koichi Kobayashi koichik
2005年 6月 1日 (水) 13:56:06 JST


小林 (koichik@休日) です.

On Wed, 01 Jun 2005 11:51:50 +0900
YOKOTA Takehiko <[E-MAIL ADDRESS DELETED]> wrote:

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

設けられたのは同時でしょうね.タイミングの話ではなく,動機の話として
「instanceMode="outer" があるから injectDependency がある」のだろうと
考えました.
その当時やりたかったことは「インスタンス生成を S2 の外部で行う」という
ことであって,「事前に定義できないコンポーネントを扱う」ではなかった
だろうということです.

> ただ、印象はともかくこの機能を追加したのが小林さんなのであれば

違いますよ〜.
その頃はまだ Seasar Project に関わってもいませんでしたね.(^^;

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

申し訳ありませんが現在はないと思います.
作成されるのがいわゆる業務アプリではなくフレームワークで,
しかもディープに S2 をお使となると,ソースを追っかけて頂くしか
ないかと.
ドキュメントチームの今後に期待ということで.

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

効率が悪いと気づかずに使われてしまうケースが発生しやすくなるんじゃないかと
心配になるという事です.

> おっしゃることは分かりますが、今回のケースでは効率を良くするために機能を
> 制限しているわけで、それが必ずしも良いかというとそうでないと自分は思いま
> す。

機能そのものが制限されているわけではないと思いますが...
injectDependency() という API が扱う問題と,横田さんが直面している
課題が異なっているというだけではないかと.つまり,

・事前にコンポーネントを定義できる × できない
・インスタンス生成を S2 が行う × 外部で行う

という 4 象限があって,一般的なケースは

「事前にコンポーネントを定義できる」&「インスタンス生成を S2 が行う」
ですよね.この場合は dicon に定義を書いて getComponent() です.
そして
「事前にコンポーネントを定義できる」&「インスタンス生成を外部で行う」
場合には dicon に定義 (instanceMode="outer") を書いて injectDependency().
「事前にコンポーネントを定義できない」&「インスタンス生成を S2 が行う」
なら実行時に register() して getComponent() だし,
「事前にコンポーネントを定義できない」&「インスタンス生成を外部で行う」
だったら実行時に register() して injectDependency().

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

難しくはないかも.
というか,injectDependency() でコンポーネント定義が見つからなければ
そこで register() しちゃうだけでもできなくはないと思います.
でも,injectDependency() というメソッドでそうするのが好ましいかというと
自分にはそう思えないですね.
それが利用者のやりたかったこと (実行時まで未知のコンポーネントを扱う)
だったのか,単なる設定の不備なのか,S2 の側から適切に判断できるとは
思えませんから.
曖昧な状況では確実に動かない方がより望ましいと私は考えます.
実行時まで未知のコンポーネントを扱いたいという事であれば,明示的に
register() すればよいだけですので.

そうじゃなくて,コンポーネントを「未定義のまま」DI したいという
要件があるのであれば検討する必要があるかも.
「実行時に定義する」と「定義しない」は全然違いますから.
どっちなんでしょう?

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




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