- PR -

DIコンテナ(Google Guice)を使う理由について

1
投稿者投稿内容
未記入
常連さん
会議室デビュー日: 2007/07/18
投稿数: 26
投稿日時: 2008-12-24 22:28
こんばんは。

現在、WEBアプリ(Struts1.2X)をStruts2.0+ibatisに刷新しています。

そこで、DIコンテナを使用するか否かで迷っています。
あまり、込み入ったアプリではないため、DIコンテナは必要ないと
思っていたのですが、Google Guiceは、速度的にも高速であること、
設定が単純であることから、使おうかどうか迷っているところです。

現在、Google Guiceを使おうと思っている箇所は、
DAOクラスのオブジェクトを作成する箇所くらいしか思いつかないのです。

その場合、DIコンテナを使わずに、Factoryクラスなどでも、問題ないような気がしています。

そこで、ものすごく単純な質問かもしれませんが、
そもそも、DIコンテナを使う理由とは何なのでしょうか?

また、みなさんがDIコンテナを使用している箇所は、
どのような箇所なのでしょうか?

わたなべ
大ベテラン
会議室デビュー日: 2007/12/09
投稿数: 123
お住まい・勤務地: 札幌
投稿日時: 2008-12-24 22:42
答えがほとんど出ていますが・・・
>設定が単純
>Factoryクラスなどでも、問題ない⇒そもそも作らなくて済む

小さなアプリで問題ないというならば使わなければいいと思います。
無理に使う必要もありません。
習得コストは当然ながらかかりますので開発スピードは下がるかもしれません。

じゃ、なんで使うかって?
経験をしておけば必要となるような案件で役に立つじゃないですか。
そもそも使った方が楽しいじゃないですか。
それじゃダメですかね。
未記入
常連さん
会議室デビュー日: 2007/07/18
投稿数: 26
投稿日時: 2008-12-24 22:48
わたなべ様

返信ありがとうございます。
こんなに早くレスがつくとは思っていませんでした。

> 習得コストは当然ながらかかりますので開発スピードは下がるかもしれません。
たしかにその通りですね。
今回は、本当に小さな案件ですので、使うのをためらっているのですが、
逆に、今回を試金石にして、今後の大きな案件の足がかりにしようかとも思っています。

そこで、みなさんがどのような箇所でDIコンテナを活用しているのかを、
お聞きできればなぁと思っています。
こんな箇所には、使うべきとか、逆にこんな箇所には使うべきではないなど。。。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2008-12-24 23:18
DIの本質的な機能ではありませんが、AOPが便利ですね。
サービス層での宣言トランザクションを使っています。

もちろんDAOでも使いますし、アクションとかバッチでも使います。
シングルトンのインスタンスを、
わざわざシングルトンパターンで実装しなくてもよかったり、
設定1つで実装クラスを取り替えたりというところですね。

小さなアプリなら、あまり意味がなかったりしますが、
アクションとかバッチを量産するときに、
サービスやDAOのセッターを書くだけでいいので、
能率も保守性もいいかと思います。
未記入
常連さん
会議室デビュー日: 2007/07/18
投稿数: 26
投稿日時: 2008-12-24 23:28
かつのり様

返信ありがとうございます。

> DIの本質的な機能ではありませんが、AOPが便利ですね。
> サービス層での宣言トランザクションを使っています。

なるほど。
今回は、ibatisを使用する予定ですので、Transactionの開始、終了などで、
使用できるかもしれません。
ありがとうございます。

ちなみに、
> もちろんDAOでも使いますし、アクションとかバッチでも使います。

ちなみに、アクションとは、StrutsのActionクラスのことでしょうか?
もしそうだとすれば、Actionのどのような箇所で使用するのでしょうか?

例えば、ActionクラスからDAOのオブジェクトを作成するようになどでしょうか?
もしくは、それ以外にも使い方がありますでしょうか?

このあたりは、作成するアプリによって変わってくる箇所だとは思いますが、
代表的な使い方などがありましたら、お聞かせください。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2008-12-24 23:45
StrutsならActionクラスですし、JSFならマネージドBeanになりますかね。
(JSFはやったことありませんが)
要はアプリケーション層のクラスです。

例えばStrutsならリクエストプロセッサを改造して、
ActionクラスのインスタンスをDIコンテナ経由で生成するようにします。
ActionクラスにはDAOをインジェクションするためのセッターメソッドと、
DAOのフィールドだけを記述します。

アクションとDAOをDIコンテナ管理下におくことで、
アクションのインスタンスを生成する際に、
DAOがインジェクションされるようにするというのが狙いです。

例えばアクションクラスにFooDaoという、
インターフェイスでインジェクションするようにしたとします。
DIコンテナの設定で、FooDaoMockという実装や、
FooDaoImplという実装を切り替えることで、
アクションクラスに手を入れなくても、一時的なテストを行うこともできます。

この辺をいちいち作りこまなくても、Seasar2ならSAStrutsなどのプロダクトもあります。
未記入
常連さん
会議室デビュー日: 2007/07/18
投稿数: 26
投稿日時: 2008-12-26 00:11
かつのり様

返信ありがとうございます。

> 例えばStrutsならリクエストプロセッサを改造して、
> ActionクラスのインスタンスをDIコンテナ経由で生成するようにします。

なるほど。確かにリクエストプロセッサを改造すれば、
すべてのActionクラス実行前に任意の処理を挟めますね。


> FooDaoImplという実装を切り替えることで、
> アクションクラスに手を入れなくても、一時的なテストを行うこともできます。

そうなんですよね。私もDIを使う上で実は、Unitテストの簡略化が
一番の魅力を感じています。
テストカバレッジが100%でなければならないとは思ってはいませんが、
なるべく、効率的にUnitテストを行いたいと考えています。

自分なりに、DIを使うメリットが把握できてきました。
これからは、本格的に開発を行っていきます。

本当にありがとうございました。

1

スキルアップ/キャリアアップ(JOB@IT)