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