【Unity】【DIコンテナ】セッターインジェクションとコンストラクタインジェクション

  • 2009.02.26 Thursday
  • 22:55
そろそろUnityもセッターインジェクションやらコンストラクタインジェクションの話に入りそうです。その前にTypeとNameの関係を間違って紹介してしまったので修正しないといけませんがー。

今回は設計に近い実装の話。
シングルトンを前提としてDIコンテナ上でロジックオブジェクトを生成する場合、コンストラクタインジェクションを用いる方が望ましいといわれています。南無南無。でも、実際にコーディングしてみると、プログラマにコーディング規約などでちょっとした縛りを設ければ、セッターインジェクションの方がはるかにコーディングがしやすくなります。これは単なる実感で、確かに「望ましい」けどセッターインジェクションの方がいいなぁーと思えます。

たとえば、下記のようにP1プロパティにセッターインジェクションを用いる場合はセッターとなるプロパティのsetterはDIコンテナから見えるようにpublicで公開する必要があります。

public class A : IA
{
 public IB P1 { private get; set; }
 public void Method() {...}
}

さて、DIコンテナが生成したAオブジェクトはシングルトンなのでしょうか?私はシングルトンの定義をはっきりと明言するスキルはありませんが、複数のユーザが使用するシングルトンで、かつ、ユーザがいつでもシングルトンを使用できる場合は、状態を持たせてはいけないという事は、はっきりといえます。しかし、セッターインジェクションの場合、コンストラクタの後にDIコンテナがセッターインジェクションを実行するまではP1はnullなわけですから思いっきり変化するフィールド、状態を持っていることになります。また、DIコンテナでなくてもAオブジェクトはP1プロパティのセッターを公開しているわけですから、第三者が意図的に値を変更できます。前者はおそらくDIコンテナがうまくかわしてくれると思いますが、後者はプログラマのアウチなミスで人為的に起こる可能性があります。

では、理想的に書くにはどうするか!?

public class A : IA
{
 private readonly IB p1;
 public A(IB p1)
 {
  this.p1 = p1;
 }
 public void Method() {...}
}

これでp1の値を買い替えられえる心配もなく、このオブジェクトのコンストラクタが終われば必ずp1は不変な値を持つことになります。これは言語的な縛りでさわやかシングルトンを提供しているので、使う側も安心、安心です。ただし、コンストラクタインジェクションでフィールドの値を設定するのは結構面倒です。さらに、セッターインジェクションより間違えやすいです。セッタープロパティを外部で書き換えるのと、設定ファイルや属性の書き間違え、どっちが起こりやすく、どっちが発見しにくいか・・・統計的な情報は何ひとつありませんが、経験則から言うとプログラマはコードを書くのがお仕事ですから、自分が書いたコードに間違いがあるときすぐに発見できます。そもそも、DIコンテナ用にプロパティは書き換えないというルールで縛られているため、書き換える動機を与えません。逆に、設定というは結構間違いやすいですよね。よね?よね?なので、理想と現実のトレードオフにかければおのずと結論がでるわけです。

こんな感じでセッターインジェクションが好まれるわけです。南無南無。

よし、これで説明すればうまくいけそうだ!
コメント
コメントする








    
この記事のトラックバックURL
トラックバック

calendar

S M T W T F S
 123456
78910111213
14151617181920
21222324252627
28293031   
<< July 2019 >>

あわせて読みたい

あわせて読みたいブログパーツ

selected entries

categories

archives

recent comment

  • 【キーボード】6年前のRealForceを復活させることはできる!?その3
    art55 (05/22)
  • 【キーボード】6年前のRealForceを復活させることはできる!?その3
    分解大好き (05/18)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    art55 (02/04)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    Gen (02/04)
  • 【キーボード】RealForce が壊れて帰ってきた。
    art55 (04/29)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    art55 (02/23)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    かるあ (02/22)
  • 【C#】Dictionaryの実装・データ構造・アルゴリズムを観察する。
    art55 (01/16)
  • 【C#】Dictionaryの実装・データ構造・アルゴリズムを観察する。
    karuakun (01/16)
  • 【NetOffice】【Excel】死なないExcelプロセスをKillする。
    art55 (12/05)

recent trackback

recommend

recommend

recommend

C#プログラマのための.NETアプリケーション最適化技法 (Programmer's SELECTION)
C#プログラマのための.NETアプリケーション最適化技法 (Programmer's SELECTION) (JUGEMレビュー »)
Sasha Goldshtein,Dima Zurbalev,Ido Flatow,サシャ・ゴルドシュタイン,ディマ・ズルバレフ,イド・フラトー

recommend

ろんりと集合
ろんりと集合 (JUGEMレビュー »)
中内 伸光
とてもわかりやすいです。

recommend

recommend

シャノン・ノイマン・ディジタル世界
シャノン・ノイマン・ディジタル世界 (JUGEMレビュー »)
市川 忠男
4章がリレーショナルデータベースな内容になってます。ページ数があまりありませんが、ポイントがものすごく的確にまとまっていて、感動します。

recommend

recommend

東プレ Realforce91UBK-S 静音キーボード 静電容量無接点方式 変荷重 ブラック NG01BS
東プレ Realforce91UBK-S 静音キーボード 静電容量無接点方式 変荷重 ブラック NG01BS (JUGEMレビュー »)

テンキーレス、静音のRealForce91UBK-S。スコスコ感がたまらなく気持ちいいです。家と会社で2台持ってます。

recommend

recommend

プログラミング.NET Framework 第4版 (プログラミングシリーズ)
プログラミング.NET Framework 第4版 (プログラミングシリーズ) (JUGEMレビュー »)
Jeffrey Richter
発売予定美 2013年10月10日。.NET Frameworkとお付き合いする人のバイブルですね。

recommend

recommend

キャット・シッターの君に。
キャット・シッターの君に。 (JUGEMレビュー »)
喜多嶋 隆
私のイラストレータデビュー本です。

recommend

Essential .NET ― 共通言語ランタイムの本質
Essential .NET ― 共通言語ランタイムの本質 (JUGEMレビュー »)
ドン・ボックス,クリス・セルズ,Don Box,Chris Sells,吉松 史彰

links

profile

search this site.

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM