[Seasar-user:6328] Re: [Seaser2] ユーティリティクラスのDI方法について

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2007年 2月 25日 (日) 00:00:41 JST


小林 (koichik) です.

Date:    Sat, 24 Feb 2007 01:35:20 +0900
From:    "Takuya Aono" <[E-MAIL ADDRESS DELETED]>
To:      [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:6321] Re: [Seaser2] ユーティリティクラスのDI方法について

>  staticメソッドを持つユーティリティクラスのStrategyをDIすることで、対応することに
> しました。
> 
> こんな感じです。
> public final class Utils {
>   static Strategy strategy = null;
>   static{
>     S2Container continer = S2ContainerFactory.create( configFilepath );
>     strategy = (Strategy)continer.getComponent( parserName );
>   }
>   public static void methodA(){
>     strategy.methodA();
>   }
> }

これだけを見てとやかく言うのもアレなんですが,
このようなコンテナの使い方はあまり好ましいとは
言いがたいように思います.

まず,このようにクラス毎にコンテナのインスタンスを
作ることは様々な問題を生じる可能性があります.
もし別のユーティリティクラスを作成することになり,
そこでも上記のようなコードを書いた場合,それぞれの
クラスの初期化時に,互いに独立したコンテナが
作成されてしまいます.
そうなると,トランザクション制御や JDBC コネクション
プールも別々になってしまいます.

コンテナで管理されるのがここで取得される Strategy と
それに DI されるコンポーネントだけで,アプリケーションの
他の部分ではコンテナもコンテナで管理されるコンポーネントも
全く使用しないなら害はないかもしれませんが,そのような
ケースはあまりないのではないかと.

せめて,SingletonS2ContainerFactory を使用し,個別に
コンテナを作成しないようにすべきだと思います.


それよりも,できればこのような形でコンテナを直接使うことを
避けるように設計を見直す方がよいかと.
例えば上記のユーティリティを呼び出すクラスもコンテナで
管理するようにすれば,そのコンポーネントに Strategy を
DI することができるようになります.
各コンポーネントは DI された Strategy を呼び出すことが
可能で,S2Container を直接使用するコードは不要になります.

基本的に,コンテナはアプリケーションから呼び出すものでは
ありません.
詳しくは次のページなどを参考にしてください.

http://kakutani.com/trans/fowler/injection.html

フレームワーク的なところを作成するのであれば
コンテナを直接呼び出すケースもあると思いますが,
それなら尚更上記のような,あまりに adhoc な
コンテナの使い方は避けるべきだと思います.

余計なお世話だったらごめんなさい.


-- 
<component name="koichik">
    <property name="fullName">"Koichi Kobayashi"</property>
    <property name="email">"[E-MAIL ADDRESS DELETED]"</property>
    <property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>




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