質問: kernel.Get(); sol.SayMyName(); } ``` 以下の記事を参考にコードを書きました. 参考:taediumの日記 Ninjectを使ってみた ※1,※2のどちらの場合でも`PersonManager`は`IPerson`にのみ依存し,`Test1`,`Test2`はどちらも`Sol`に依存しているので,依存関係に関しては※1,※2どちらが優れているということは無いと考えています. ※2は※1よりコードが複雑になっていますし,どういう場面でDIコンテナを使用するといいのかがわかりません. DIコンテナを使用するとこういう場面で非常に役に立つ,という例を教えてください. C#以外の言語,Ninject以外のDIコンテナでも構いません. 以下追記 2015.06.30 --------------- 皆さんありがとうございます. 特に@thubさん, @unaristさんのコメントで理解が深まりました. 端的に言えば`new Sol(new Hoge(new Foo()), MAGIC_NUMBER, new Bar())`のように生成が複雑になった場合,DIコンテナを使ったほうが便利.ということだと理解しました. また,DIコンテナ側の機能で,オブジェクトのスコープをSingletonやThreadLocalにできたり,Privateなフィールド,メソッドにDIできるというのは確かなメリットだと感じました. 追記の追記(読み飛ばして結構です) 2015.07.01 ---------------------------- 私の質問の仕方が良くなかったのですが,この質問はDI自体のメリットを聞くつもりではなく,DIのコードを自分で書く場合と,DIコンテナを使った場合の差が知りたい.という意図で質問をしたつもりでした.InterfaceによるDIは日常的に行っており,そのメリットも理解・体感しております. DIのコードを自分で書く場合も,DIコンテナを使う場合でも,オブジェクトの生成ルールを書く際は具象クラスに依存する.DIコンテナのオブジェクト生成ルールを書く場合も,自分でFactoryメソッドを用意する場合と比較してコード量も減るようには見えない.どこにメリットがあるんだろう?という疑問からの質問でした. みなさんのコメントのおかげでとても理解が深まりました.ありがとうございました.
回答: ### DIコンテナを使わない場合 ``` var sol = new PersonManager(new Sol()); ``` この部分は具象クラスであるSolクラスに依存してしまいます。 PersonManagerを使う箇所が多数ある場合、`new Sol()`する箇所も多くなります。SolクラスをKyクラスに変更したくなった場合、修正箇所が多くなりメンテナンス性が低くなります。 また、SolクラスがAクラスに依存していて、AクラスがBクラスに依存しているといった感じで、構造を持っている場合、依存性の注入を多段階で行う必要があり、`new Sol()`する箇所が多くなると非常に辛くなってきます。構造に変更があった場合、修正が大変です。 ### DIコンテナを使うと new Sol()する箇所をDIコンテナにバインドする一箇所に限定することができ、メンテナンス性が高くなります。構造が複雑な場合でも、構造はバインド箇所のみに隠蔽されます。 また、DIコンテナにオブジェクトを格納して、シングルトンパターンとして利用することもでき、メモリの効率化も行えます。 PHPとpimpleというDIコンテナの例になりますが、以下のサイトが参考になります。 参考サイト