上一篇我们分析了注入的基本过程,这篇我们就注入的规则、限定和继承做进一步的分析。
规则
var injector:Injector = new Injector(); var injectObj:InjectObject = new InjectObject(); injector.mapValue(InjectObject, injectObj); ----------------------- [Inject] public var injectPoint:InjectObject;
上面的代码实现了注入,当注入点需要一个InjectObject类型对象的时候,injector找到了injectObj这个对象并传入到这个注入点。根据需求找到对应的对象,这就是注入规则(InjectionConfig)。每个Injector内部有一张规则映射表,请求标识为键,以映射对象为值的映射表。上述例子中InjectObject是请求标识,injectObj是该标识的映射对象。mapValue的意义就是在injector的规则表中增加一项注入规则。
SwiftSuspenders提供的注入规则有:
mapValue,mapClass,mapSingleton,mapSingletonOf。
//每次请求whenAskedFor时直接使用useValue mapValue(whenAskedFor:Class, useValue:Object, named:String = "") //每次请求whenAskedFor时创建一个新的instantiateClass实例 mapClass(whenAskedFor:Class, instantiateClass:Class, named:String = "") //每次请求whenAskedFor时使用同一个whenAskedFor实例(第一次使用时创建) mapSingleton(whenAskedFor:Class, named:String = "") //每次请求whenAskedFor时使用同一个useSingletonOf实例(第一次使用时创建),多用于请求接口 mapSingletonOf(whenAskedFor:Class, useSingletonOf:Class, named:String = "")
限定
每个注入规则都有请求标识,请求标识以类或接口为标识之外还可以加上一个限定符,SwiftSuspenders最终以【类(接口)+限定符】作为唯一请求标识。
injector.mapValue(InjectObject, injectObj, "myInjection"); ----------------------- [Inject(name="myInjection")] public var injectPoint:InjectObject; //这样的注入是成功的
这里类InjectObject和字符串"myInjection"一起作为一个注入规则的标识,而不是单单以InjectObject为标识。以下两种情况的注入是不会成功的。
injector.mapValue(InjectObject, injectObj); ----------------------- [Inject(name="myInjection")] public var injectPoint:InjectObject; //这样的注入是不成功的
injector.mapValue(InjectObject, injectObj, "myInjection"); ----------------------- [Inject] public var injectPoint:InjectObject; //这样的注入是不成功的
继承
注入器可以创建子注入器,子注入器除了可以添加属于自己的注入规则之外它还会继承父注入器的所有注入规则。
var injector:Injector = new Injector(); var injectObj:InjectObject = new InjectObject(); var rule1:InjectionConfig = injector.mapValue(InjectObject, injectObj); var childInjector:Injector = injector.createChildInjector(); var rule2:InjectionConfig = childInjector.mapValue(InjectObject, injectObj, "child");
injector拥有一个注入规则rule1,而它的子注入器childInjector拥有rule2和rule1两个注入规则。
下面给出一个完整的范例来说明子注入器的注入规则。
package { public class InjectObject { public function InjectObject() { trace("InjectObject Created"); } } } package { public class InjecteeClass { [Inject] public var injectPoint1:InjectObject; [Inject(name = "child")] public var injectPoint2:InjectObject; public function InjecteeClass() { trace("InjecteeClass Created"); } } } package { import flash.display.Sprite; import org.swiftsuspenders.Injector; public class InjectorTest extends Sprite { public function InjectorTest() { var injector:Injector = new Injector(); injector.mapClass(InjectObject, InjectObject); var childInjector:Injector = injector.createChildInjector(); childInjector.mapClass(InjectObject, InjectObject, "child"); var instance:InjecteeClass = childInjector.instantiate(InjecteeClass); } } }
输出
--------------------------------------------
InjecteeClass Created
InjectObject Created
InjectObject Created
运行结果显示InjecteeClass的两个注入点都可以正常接收注入。 如果将
var instance:InjecteeClass = childInjector.instantiate(InjecteeClass);
换成
var instance:InjecteeClass = injector.instantiate(InjecteeClass);
运行时会报错,因为第二个注入点不在injector的注入规则内。