= Simple Injectorを使う = == 概要 == 名前の通りシンプルなインジェクタ。ユニットテスト目的のためにはこれで十分。 スピードも高速(らしい)。以下ではGuiceと比較しながら、使用法を説明。 == 基本的な使い方 == === バインディング === SimpleInjector.dll(.NET 3.5用と4用がある)を参照設定し、以下を記述。 {{{ using SimpleInjector; }}} インジェクタを生成するが、Guiceのように生成時にモジュール指定はしない。 クラス名はContainerだが、変数名はinjectorとしておく。 {{{ Container injector = new Container(); }}} バインディングはそれぞれメソッドを呼び出すことによって行う。 シングルトンの場合は、RegisterSingle、通常のオブジェクトの場合はRegisterをつかう。 {{{ injector.RegisterSingle(); injector.Register(); }}} その場でシングルトンを生成する場合は以下。 {{{ injector.RegisterSingle(new Sample()); }}} ※Guiceのような@ImplementedByや@Singletonアノテーションは無い。 また、GuiceのようなModuleといったものは用意されていない。 それぞれのバインディングについてRegister*を呼び出す必要がある(例外あり)。 GuiceではInjector作成時にすべてのモジュールを指定するので、(おそらく)その場でバインディングの矛盾が検出することができるが、Simple Injectorではそうではない。 そこで、Verify()というメソッドを呼び出すことにより、バインディングの矛盾を検出するらしい。 {{{ injector.Verify(); }}} このメソッドは、各オブジェクトを実際に生成してしまうことに注意。テスト時にのみ呼び出すことが望ましいとおもわれる。 === オブジェクトの取得 === これはGuiceと同様に行うことできる。 {{{ IAccount account = injector.GetInstance(); }}} コンストラクタ注入は何もしなくとも自動的に行われる。 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/|本家]]