Quillでインジェクションを行いたい場合、
Implementation属性を使用するが、
もう一種HashMapを使ってインジェクションする方法を追加したい。
目的
・Quill用として作られていないクラス(別プロダクトやSeasarの既存クラス、インターフェース)も
Quillコンポーネントとして扱えるようにする
(必ずシングルトン、コンストラクタ引数なしのみ、というルールはそのまま)
・テスト用と本番用の使用コンポーネントをより切り替えやすくする
具体的にはQuillInjector#Injectに下記のようなオーバーロードを追加する。
QuillInjector#Inject(object target, InjectionMap injectionMap)
InjetionMapはシングルトンとして作成。
中身はIDictionary<Type, Type>。キーがinterfaceの型、値が実装型。
+Add(Type interfaceType, Type implType) // Implementation(typeof(XXX))と同じ意味
+Add(Type componentType) // Implementationと同じ意味
追加したキーが重複した場合は専用例外を投げる。
QuillInjector#InjectionMapに設定すると
InjectionMapのキーに該当するものがあれば
Implementation属性が設定されていなくても
その値を使ってインジェクションを行う。
インジェクションの優先度は下記のようにする予定
1.S2Container (dicon) (Binding属性使用)
2.InjectionMap
3.Implementation属性
InjectionMapをImplementationより優先させているのは
テストのときはInjectionMap、本番はImplementation属性を使用して
きっちり分ける、という使い方もアリと考えたため。
○修正方法
QuillInjectorにメソッドを追加する形で行う予定。
QuillInjectorを継承して別クラス・・・というのも考えたが
インジェクションの方法でユーザが使うクラスまで変えるのは
使う側にとってわかりにくくなる可能性が高いのでこちらの方法で。