S2Container.NET 1.3.14からの新機能について

Quill用に作っていない既存ライブラリでも
Quillのインジェクション対象にしたい」
と思われたことはないでしょうか?


S2Container.NET 1.3.14のQuillでは
Implementation属性を使わずにインジェクションできる方法を
追加しています(※)。
InjectionMapというクラスを使う方法です。
(Implementation属性を使った標準の設定方法はこちら)


追加の目的は以下になります。

  • Quill用に作られていない既存ライブラリ(前システムのものやSeasar以外のものなど)
    でもQuillコンポーネント化できるようにする
  • テストコードなどでより容易に、任意にコンポーネントの切り替えができるようにする



2月中にはドキュメントに書く予定ですが、
簡単な使い方は

  1. Quillコンポーネント化したい型をInjectionMapに登録
  2. QuillInjectorにInjectionMapを設定
  3. QuillInjector#Injectを呼び出す

となります。
「1.」の部分がImplementation属性を使って設定していた部分になります。


○具体的なコード例


InjectionMap injectionMap = InjectionMap.GetInstance();
injectionMap.Add(typeof(TestImpl)); // 実装クラスを直接登録する場合
injectionMap.Add(typeof(IHoge), typeof(HogeImpl)); // インターフェース+実装クラスの場合

QuillInjector injector = QuillInjector.GetInstance();
injector.InjectionMap = injectionMap;

InjectionTarget target = new InjectionTarget // (DIを適用させたいクラス)
injector.Inject(target);

上記のように書くと

[Implementation]
public class TestImpl

[Implementation(typeof(HogeImpl))]
public interface IHoge

と定義していた場合と同じ処理が行われます。
既に同じインターフェースがImplementation属性で指定されている場合も
InjectionMapによる設定が優先されます。

というような使い分けもできることを想定しています。


※注
InjectionMapを使う場合も
必ずsingleton」「コンストラクタは引数なし」という
従来からある制約はルールのシンプルさを保つために
引き続き存在します。