认识Robotlegs(三)RL内置的注入机制

  Robotlegs中的注入是由注入器Injector实现,先来看看Robotlegs中哪些地方存在注入器Injector。

  首先Context里面有Injector,CommandMap、MediatorMap和ViewMap里面也有Injector。

  Context自身内部除了有一个Injector单例之外还有CommandMap、MediatorMap、ViewMap这些单例,这些对象内部具有Injector。Robotlegs框架内部存在Injector的类基本上就是这4个,当然除了Context内部的commandMap、mediatorMap、viewMap单例之外你也可以手动创建新的CommandMap、MediatorMap、ViewMap,本文不讨论这种情况,我们在此只分析Robotlegs内置结构的4种Injector和它们的注入机制,后面提到的CommandMap、MediatorMap、ViewMap皆是指Context.commandMap、Context.mediatorMap和Context.viewMap。

  Context,CommandMap,MediatorMap,ViewMap内部都有Injector,但它们是不同的。CommandMap.injector和MediatorMap.injector是Context.injector的子注入器,它们都继承了Context.injector的注入规则,同时又拥有各自的注入规则。而ViewMap.injector使用的就是Context.injector,也就是说ViewMap和Context的注入器是同一个。

  Robotlegs区别与其他mvc框架的特色是运用了命令模式和中介模式规范了注入机制的使用,从而使整个应用程序框架结构更清晰高效易于维护。下面我们具体来分析一下这些注入机制。

Context相关的注入机制    

  Context中的Injector就是注入器的一般用法,Context在初始化的时候内部的添加了下面这些注入规则:

    injector.mapValue(IReflector, reflector);
    injector.mapValue(IInjector, injector);
    injector.mapValue(IEventDispatcher, eventDispatcher);
    injector.mapValue(DisplayObjectContainer, contextView);
    injector.mapValue(ICommandMap, commandMap);
    injector.mapValue(IMediatorMap, mediatorMap);
    injector.mapValue(IViewMap, viewMap);
    injector.mapClass(IEventMap, EventMap);

  被Context.Injector(或者子注入器)注入过的类内部都可以接收这些注入规则。注意这里的EventMap不是对象实例,每个IEventMap请求都会得到一个新的EventMap对象。此外,经过ViewMap映射的显示对象也可以接收这些注入规则,本文ViewMap相关的注入机制中会介绍。

CommandMap相关的注入机制     

  CommandMap内部的Injector是Context.Injector的子注入器。调用CommandMap.mapEvent方法时需传入(eventType:String, commandClass:Class, eventClass:Class = null)这些参数,CommandMap为总线eventDispatcher添加名为eventType的事件侦听。 当总线eventDispatcher派发名为eventType的事件时CommandMap执行了如下代码:

    injector.mapValue(Event, event);//这里Event是flash.events.Event 或者是eventClass类型,event是总线eventDispatcher派发的事件。
    var command:Object = injector.instantiate(commandClass);
    command.execute(); 

  总线eventDispatcher接收到事件时Robotlegs会创建commandClass对象实例,同时把event注入到了commandClass,如果commandClass内部需要接收这个注入只要加入如下代码:

    [Inject]
    public var event:Event;    //也可以把Event换成eventDispatcher派发的具体事件类型eventClass。

  前面说过CommandMap.Injector是Context.Injector的子注入器,所以CommandMap.Injector把自身的注入规则注入到commandClass的同时也会把Context.Injector的注入规则注入进commandClass。事实上commandClass的基类Command已经为我们定义了下面这些注入点,我们在commandClass内部可以直接使用这些注入。

    [Inject]
    public var contextView:DisplayObjectContainer;
    [Inject]
    public var commandMap:ICommandMap;
    [Inject]
    public var eventDispatcher:IEventDispatcher;
    [Inject]
    public var injector:IInjector;
    [Inject]
    public var mediatorMap:IMediatorMap;

MediatorMap相关的注入机制

    MediatorMap内部的Injector是Context.Injector的子注入器。调用MediatorMap.mapView方法时需传入(viewClass:*, mediatorClass:Class, injectViewAs:* = null)这些参数,MediatorMap为contextView添加Event.ADDED_TO_STAGE事件,viewClasss实例为显示对象且必须为contextView的子显示对象。当viewComponent显示对象创建并添加到Stage的时候MediatorMap执行了如下代码:

    var mediator:IMediator;
    injector.mapValue(viewClass, viewComponent);
    mediator = injector.instantiate(mediatorClass);
    mediator.onRegister();

所以Robotlegs在创建mediatorClass对象实例的同时把viewComponent注入到了mediatorClass,如果mediatorClass内部需要接收这个注入只要加入如下代码:

    [Inject]
    public var view:viewComponent;

  在mediatorClass的onRegister方法内部可以访问到注入的view。 另外要注意的是一个mediator可以对应多个view,MediatorMap.mapView方法有injectViewAs这个参数,它可以是一个viewClass组成的数组,如果是这种情况injector会为每一个viewClass都创建注入规则,这样在mediatorClass内部可以接收多个viewClass注入。 当injectViewAs参数非空的时候会忽略viewClass参数。

  同样,前面说过MediatorMap.Injector是Context.Injector的子注入器,所以MediatorMap.Injector把自身的注入规则注入到mediatorClass的同时也会把Context.Injector的注入规则注入进mediatorClass。事实上mediatorClass的基类Mediator已经为我们定义了下面这些注入点,我们在mediatorClass内部可以直接使用这些注入。

    [Inject]
    public var contextView:DisplayObjectContainer;
    [Inject]
    public var mediatorMap:IMediatorMap;

ViewMap相关的注入机制

  ViewMap可以添加显示对象(DisplayObject的子对象),经过ViewMap.mapType添加的显示对象第一次被放置到舞台的时候会被注入Context.injector的注入规则,在这些对象内部可以添加注入点来接收Context.injector的注入。当显示对象添加到舞台时ViewMap执行了如下代码:     injector.injectInto(target);

  这里的injector就是Context.injector,target是被ViewMap.mapType添加过的显示对象。target可以接收的注入规则可以参考上面的Context相关的注入机制。     此外ViewMap还有一个ViewMap.mapPackage方法用来添加类名前缀,如果被放置到舞台的显示对象的类名符合这些前缀同样也会被注入Context.injector的注入规则。

KevinChu

2014-6-11

认识Robotlegs(三)RL内置的注入机制

时间: 2024-10-19 03:20:50

认识Robotlegs(三)RL内置的注入机制的相关文章

C#内置的事件机制和Unity3D姻缘

最近因为项目,也因为一些其他事情而导致学习的停止,抽个空来记录下C#内置的事件在Unity3D中的使用. 我需要让一个物体对鼠标悬停做出事件的响应的情况下,我们通常会创建一个继承MonoBehaviour的脚本然后挂到该物体上,然后为该脚本创建OnMouseOver方法,例如我们需要悬停来改变物体颜色,可能会这样写. using UnityEngine; using System.Collections; public class ChangeColor : MonoBehaviour { vo

从零开始的JS生活(三)——内置对象

咱们继续进行我们的正经的JS介绍.今天所要跟大家讲述的是JS中十分常用.十分常用.十分常用的内置对象. 一.世界上最熟悉的陌生就是,当你看着数组.而我看着你... - 数组对象 1.数组的概念 在内存中 连续存储 多个 有序 元素的结构(元素的顺序称为下标,通过下标查找对应元素): 2.数组的声明 2.1 通过字面量声明 JS中同一数组可以储存多种不同数据类型(但一般同一数组只用于存放同种数据类型) 2.2 new关键字声明:var arr2 = new Array(参数); >>>参数

开源的Android开发框架-------PowerFramework使用心得(三)内置浏览器BrowserActivity

使用内置浏览器必须是引用源码的方式(因为jar中不能打包布局文件等资源).内置浏览器是一个继承自BaseActivity的普通Activity,使用WebView实现. 1.简单的打开内置浏览器 Intent i = new Intent(this,BrowserActivity.class); i.putExtra("url", "http://www.baidu.com/"); startActivity(i); 2.设置浏览器主题 Intent i = new

Maven系列三Maven内置变量

Maven内置变量说明: ${basedir} 项目根目录(即pom.xml文件所在目录) ${project.build.directory} 构建目录,缺省为target目录 ${project.build.outputDirectory} 构建过程输出目录,缺省为target/classes ${project.build.finalName} 产出物名称,缺省为${project.artifactId}-${project.version} ${project.packaging} 打包

咸鱼入门到放弃8--jsp<三>jsp内置对象

NO. 内置对象 类型 1 pageContext javax.servlet.jsp.PageContext 2 request javax.servlet.http.HttpServletRequest 3 response javax.servlet.http.HttpServletResponse 4 session javax.servlet.http.HttpSession 5 application javax.servlet.ServletContext 6 config jav

app version updates must utilize the iOS built-in update mechanism(app的更新必须用iOS内置的更新机制)

今天有一个app审核被拒了,提示app里面包括了一个更新按钮,而app的更新必须用IOS的内置更新机制,而不是app里面含有更新视图 苹果的审核规则随时都会变,好吧,那就去掉了,重新打包上传审核

python关于list的三个内置函数filter(), map(), reduce()

''' Python --version :Python 2.7.11 Quote : https://docs.python.org/2/tutorial/datastructures.html#more-on-lists Add by camel97 2017-04 ''' 1.filter() #filter(function, sequence) returns a sequence consisting of those items from the sequence for whic

javascript学习(三) 内置对象

一:事件(Event)对象 在触发dom事件的时候都会产生一个event对象 type   获取事件类型 target  获取事件目标 stopPropagation()  阻止事件冒泡 preventDefault() 阻止事件默认行为 eg: 二:string对象 lenget          长度 indexof()     位置 march()       内容匹配 replace()      替换 toUpperCase  大小写转换 split()          字符串变为数

android菜鸟学习笔记23----ContentProvider(三)利用内置ContentProvider监听短信及查看联系人

要使用一个ContentProvider,必须要知道的是它所能匹配的Uri及其数据存储的表的结构. 首先想办法找到访问短信及联系人数据的ContentProvider能接受的Uri: 到github上找对应ContentProvider的源码:https://github.com/android 有好多个,哪一个才是短信数据的ContentProvider呢? 在filters输入框:输入telephony. 现在只有一个了,打开: 装有git的话,可以选择clone到本地,没有的话,就选择下载