依存性を注入せよ(プロパティインジェクション)
.NET2.0によるDI(Dependency Injection)だけど予定していたインジェクション手法
・コンストラクタインジェクション ・プロパティインジェクション(メソッドインジェクション) ・コンフィグインジェクション
これらについての実装が一段落ついた。
がしかし.NETならではともいえるプロパティインジェクションに関して悩ましい状況が発生している。
例えば以下のような設定用ファイル(components.config)でDIコンテナにコンポーネントのバインドを指示するとしよう
コンポーネント"FooForm"はSystem.Windows.FormsネームスペースのFormクラスを直接派生したクラスでありテキストボックスが3つ乗っかっているとする。
アプリケーションでは以下のコードによりDIコンテナに生成されたフォームのインスタンスが取得できる。
DIContainer di = DIContainer.GetInstance(); Form mainForm = (Form)di.GetComponent("FooForm");
(本来DIとしての効用は生成された参照をインタフェースで受ける事で最大となるのだが今回は例が解り易いように敢えて具象クラスで書いている)
ここでせっかくDIによりインスタンス生成の依存性を注入できたのだから他のプロパティも生成時に注入したいと思うのは当然。
例えばフォームのTextプロパティをインジェクションするならばこんな感じに書ける。
"プロパティインジェクションだべ"
冒頭に書いた今回の悩みとはここからだが、上記のようにプロパティの値を注入できるのであればFooForm上に乗っかっている3つのテキストボックスの初期値をインジェクションできないかなぁということをふと思ってしまったのだ。
(α)"最初のテキスト" "次のテキスト" "最後のテキスト"
こんな感じ。もちろん3つのテキストボックスに相当するプロパティは公開されている必要がある。
セッタインジェクションやメソッドインジェクションであればこんな記述は考えなくてもいいんだろうけど、プロパティは階層があるのでこういう書き方を許しても良いのかなぁ、なんて。
しかし、この記述を許してしまうと際限がなくなりそうな気もして躊躇してしまう。
やはりちゃんと階層が必要無いように予めFooFormに3つのテキストボックスに対応したプロパティを実装しておきそのプロパティにインジェクションするべきだろうか。
(β)"最初のテキスト" "次のテキスト" "最後のテキスト"
ううん。やはり通常の手動バインドはこの方法で記述してあとはSeasar2のようにOGNLみたいな記法を使えるようにしてやるのがいいのかなぁ。