Upload page content

You can upload content for the page named below. If you change the page name, you can also upload content for another page. If the page name is empty, we derive the page name from the file name.

File to load page content from
Page name
Comment

Locked History Actions

CS/DI/SimpleInjector

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 {
  }

参考