[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 メーリングリストの案内