S2Container.NET 1.3.14からの新機能について
「Quill用に作っていない既存ライブラリでも
Quillのインジェクション対象にしたい」
と思われたことはないでしょうか?
S2Container.NET 1.3.14のQuillでは
Implementation属性を使わずにインジェクションできる方法を
追加しています(※)。
InjectionMapというクラスを使う方法です。
(Implementation属性を使った標準の設定方法はこちら)
追加の目的は以下になります。
- Quill用に作られていない既存ライブラリ(前システムのものやSeasar以外のものなど)
でもQuillコンポーネント化できるようにする - テストコードなどでより容易に、任意にコンポーネントの切り替えができるようにする
2月中にはドキュメントに書く予定ですが、
簡単な使い方は
となります。
「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」「コンストラクタは引数なし」という
従来からある制約はルールのシンプルさを保つために
引き続き存在します。