今回はDIコンテナの拡張について考えたいと思います。かつのりさまの DIコンテナまとめ を踏襲しています。
私の主張は一言でいえば、「DIはnew演算子へのAOPで表現できる」というものです。ここでいうDIは依存性の注入(Dependency Injection)、 AOPはアスペクト指向(Aspect-Oriented Programming)のことです。
DIを用いたインスタンス生成は、オブジェクトの初期化という横断的関心事(Cross-Cutting Concerns、)を取り扱っていると私は捉えました。
DIを用いるシーンというのがオブジェクト生成に限定されます。多種多様な場所でのオブジェクト生成に対して、依存性の注入を行うわけですが、これこそアスペクト指向で取り扱われる横断的関心事の一例であると捉えたのです。
DIコンテナの実現を考える場合、new演算子もしくはコンストラクタに対して依存性の注入処理をウィービング(Weaving)することで実現可能なはずです。
これを逆に捉えると、あらゆる箇所のあらゆるオブジェクトの生成に対し、 DIによる依存性の注入が可能ということになります。
通常、DIが活用される箇所としてはオブジェクトのライフサイクルが長い場所が選ばれます。分かりやすいのはsingletonインスタンスによるリソース管理クラスといったものです。こうしたオブジェクトには静的なパラメータ設定で初期化をすれば事足ります。
new演算子にウィービングしてDIを行うのであれば、多分、静的なパラメータでは足りません。今のソースコード上でのthisポインタからプロパティを設定するといった、より動的なパラメータによる初期化がしたくなると思うのです。
これは、コンストラクタ引数にthis.getXXX()といったプロパティを渡してオブジェクトを生成するような部分を外部設定ファイルに掃きだすことで疎結合化しようという試みになるのではないでしょうか。
このような機能性があったとして、どのような応用例があるのか、実はよくわかりません。既存のDIコンテナでも、FactoryオブジェクトをDIで生成することで似たようなことは出来るのではないかと思います。
DIを使ったデザインパターンを収集・整理して見ると活用方法が見出せるような気もします。
投稿日時 : 2007年8月29日 19:07