[Seasar-user:2076] Re: injectDependencyについて
YOKOTA Takehiko
takehiko
2005年 6月 1日 (水) 16:20:48 JST
横田です。
Koichi Kobayashi wrote:
>>#ちなみにさらに言えばdiconファイルなしに空のS2Containerを生成してそこに
>>#全てのcomponent定義をregisterしたかったり、既存のS2Containerからcomponent
>>#定義をunregisterしたかったりもします。そこまで現時点のS2の機能で実現でき
>>#るのかは未調査ですが。^^;
>
>
> ヘビーですね.(^^;
> っていうか,builder を作る方が適切かもしれませんね.
そういう手もあるのですか。おいおい勉強していきます。
ちなみに端的にやりたいことは、S2ベースアプリのオーバライドなんです。
既に存在するS2ベースアプリがあるとして、それをちょっとだけカスタマイズ
したアプリを作る際に、直接元のアプリのdiconファイルをいじるのではなく、
元のアプリ用diconファイルにカスタマイズ分のdiconファイルを重ねるという
感じです。
例えば、
orig.dicon:
<component name="hoehoe" class="HoehoeImpl" />
<component name="fufufu" class="FufufuImpl" />
customized.dicon:
<component name="hoehoe" class="CustomizedHoehoeImpl" />
で
S2Container container = S2ContainerFactory.create(
"orig.dicon", "customized.dicon");
とすると、
((Hoehoe)container.getComponent(Hoehoe.class)).getClass().getName()
--> "CustomizedHoehoeImpl"
でかつ
((Fufufu)container.getComponent(Fufufu.class)).getHoehoe().getClass().getName()
--> "CustomizedHoehoeImpl"
となる、すなわちcustomizedContainerが
app.dicon:
<component name="hoehoe" class="HoehoeImpl" />
<component name="hoehoe" class="CustomizedHoehoeImpl" />
である場合の S2ContainerFactory.create("app.dicon") と同じ挙動をするよう
にしたいということです。(先ほどのinjectDependencyのニーズとは別にこうい
うニーズを持っている、ということです。)
>>すいません、ちょっと意味が分からないのですが「未定義のままDIしたい」
>>とは具体的にはどういうことでしょうか。
>
> ランタイムも含めて S2 コンテナにコンポーネントの情報を持たせることなく
> DI したいのか,ということです.
> その場合,DI されたコンポーネントは他のコンポーネントに対する DI の
> 対象にはならなくなるというのが大きな違いではないかと.
理解しました。確かにそういう用途はあるかもしれません。私の今回のニーズ
でも、実はS2外コンポーネントをS2にregisterする必然性はないのです。単に
S2管理下のコンポーネントをinjectするためだけにregisterする、ということ
です。
>>ちなみに私のケースでは「定義したくてもできない」という感じですので、
>>injectDependencyの直前に定義してregisterすればそれで済みそうです。
>
> デザインタイムでは「できない」であって,ランタイムで「できない」わけでは
> ないですよね.
はい、そうです。
> なので,「定義できない」ではなくて「定義しない」ということ.
> コンテナから他のコンポーネントを取ってきて DI したいだけで,
> それ自身について S2 には全く関与して欲しくないというケースだと,
> register() は要求を満たさないという事になります.
私のケースでは、「S2には関与して欲しくない」というほどではありませんが、
「(registerによって)関与させることをしないでもinjectできるならそれは
それで楽」という感じです。
> そういう要求がほどほどにあるのなら,DependencyInjectionUtil とか
> 作ってもいいかも〜.
これがまさたかさんの考えとつながるわけですね。(実現方法はともかくと
して)これがあると結構うれしいです。
> DependencyInjectionUtil#injectDependency(Object target, S2Container container)
>
> みたいな.この中で target を introspection してコンテナから取ってきた
> コンポーネントを DI .コンテナ自身は target に全くノータッチ.
ちなみにこの中ではどういう処理を行なうのですか?container#getComponentDefとか
を使うのでしょうか。
--
YOKOTA Takehiko
[E-MAIL ADDRESS DELETED]
Seasar-user メーリングリストの案内