DIコンテナを使うメリットが分からない
現在C#とNinjectを使ったDIについて学習を進めております.
コンストラクタ・Setter・メソッドの引数の型にインターフェイスを使う方法(※1)と比較して,DIコンテナを使う方法(※2)が優れている点がわかりません.
interface IPerson { string Name(); }
class Sol : IPerson { string Name() { return "Sol"; } }
class Ky : IPerson { string Name() { return "Ky"; } }
class PersonManager
{
private IPerson _p;
<Inject> public PersonManager(IPerson p) { _p = p; }
public string SayMyName() { return _p.Name(); }
}
// ※1
void Test1()
{
var sol = new PersonManager(new Sol());
sol.SayMyName();
}
// ※2
void Test2()
{
var kernel = new StandardKernel();
kernel.Bind<IPerson>().To<Sol>();
kernel.Bind<PersonManager>().ToSelf();
var sol = kernel.Get<PersonManager>();
sol.SayMyName();
}
以下の記事を参考にコードを書きました.
参考:taediumの日記 Ninjectを使ってみた http://d.hatena.ne.jp/taedium/20100307/p1
※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メソッドを用意する場合と比較してコード量も減るようには見えない.どこにメリットがあるんだろう?という疑問からの質問でした.
みなさんのコメントのおかげでとても理解が深まりました.ありがとうございました.