= Simple Injectorを使う =

== 概要 ==

名前の通りシンプルなインジェクタ。ユニットテスト目的のためにはこれで十分。
スピードも高速(らしい)。以下ではGuiceと比較しながら、使用法を説明。

== 基本的な使い方 ==

=== バインディング ===

SimpleInjector.dll(.NET 3.5用と4用がある)を参照設定し、以下を記述。
{{{
using SimpleInjector;
}}}
インジェクタを生成するが、Guiceのように生成時にモジュール指定はしない。
クラス名はContainerだが、変数名はinjectorとしておく。
{{{
Container injector = new Container();
}}}
バインディングはそれぞれメソッドを呼び出すことによって行う。
シングルトンの場合は、RegisterSingle、通常のオブジェクトの場合はRegisterをつかう。
{{{
  injector.RegisterSingle<ISomeFactory, SomeFactory>();
  injector.Register<IAccount, Account>();
}}}
その場でシングルトンを生成する場合は以下。
{{{
 injector.RegisterSingle<ISample>(new Sample());
}}}

※Guiceのような@ImplementedByや@Singletonアノテーションは無い。
また、GuiceのようなModuleといったものは用意されていない。
それぞれのバインディングについてRegister*を呼び出す必要がある(例外あり)。

GuiceではInjector作成時にすべてのモジュールを指定するので、(おそらく)その場でバインディングの矛盾が検出することができるが、Simple Injectorではそうではない。
そこで、Verify()というメソッドを呼び出すことにより、バインディングの矛盾を検出するらしい。

{{{
  injector.Verify();
}}}

このメソッドは、各オブジェクトを実際に生成してしまうことに注意。テスト時にのみ呼び出すことが望ましいとおもわれる。

=== オブジェクトの取得 ===

これはGuiceと同様に行うことできる。
{{{
  IAccount account = injector.GetInstance<IAccount>();
}}}

コンストラクタ注入は何もしなくとも自動的に行われる。
Simple Injectorに対し、唯一のpublicコンストラクタを持つクラスの生成を指示すると、そのコンストラクタ引数を自動的に注入する。

※Guiceのような@Injectアノテーションは必要ない。

{{{
  class Account : IAccount {
    public Account(ISomeFactory someFactory, Container injector, FooBar fooBar) {
      ....
    }
  }
}}}
上のコンストラクタ引数のうち、ISomeFactoryはRegisterSingleで登録されたもの。
injectorはインジェクタ自身、FooBarは特に登録されていないが、インターフェースや抽象クラスでなければそれが勝手に生成されて注入される。

{{{
  class FooBar {
  }
}}}



== 参考 ==

 * [[http://simpleinjector.codeplex.com/|本家]]