资源预览内容
第1页 / 共45页
第2页 / 共45页
第3页 / 共45页
第4页 / 共45页
第5页 / 共45页
第6页 / 共45页
第7页 / 共45页
第8页 / 共45页
第9页 / 共45页
第10页 / 共45页
亲,该文档总共45页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
1. Robotlegs 是什么 2. 依赖注入 3. 使用 Injectors oSwiftSuspenders 适配器注入语法 oInjector 类的映射注入 oMediatorMap 类的依赖注入 oCommandMap 类的依赖注入 4. The Context 5. MVCS 参考实现 1. Context 2. Controller /未命名注入Inject(name=“myNamedDependency“)public var myNamedDependency:NamedDepedency; /命名注入Robotlegs 里三处提供了注入映射. MediatorMap, CommandMap, 和直接通过 Injector . MediatorMap 和 CommandMap 也都是使用 Injector, 但它们同时做了一些各自层(tier)所需要的额外工作. 顾名思义, MediatorMap 用来映射 Mediator, CommandMap 用来映射 Command, 其它所有需要被注入的内容 (包括但不限于 Model) 都要直接使用 Injector 映射.Injector 类的映射注入具体 Injector 类的适配器都遵照 IInjector 接口. 这个接口为不同的依赖注入解决方案提供了统一的 API. 本文档专注于 SwiftSuspenders, 但这些语法同样适应于其它任何遵照 Iinjector 接口的 Injector.injector 是你应用程序里所发生的所有依赖注入的生产车间. 它用来注入框架 actor, 同时也可以用来执行你的应用程序所需要的任何其它注入. 这包括但不限于 RemoteObjects, HTTPServices, 工厂类, 或者事实上任何有可能成为你的对象所需要的依赖的类/接口.下面是实现 IInjector 接口的类所提供的四个映射方法:mapValuemapValue 用来映射一个对象的特定实例到一个 injector. 当请求一个特定的类,使用类的这个特定实例来注入./你的应用程序中某个映射/配置发生的地方var myClassInstance:MyClass = new MyClass();injector.mapValue(MyClass, myClassInstance);/在接收注入的类中Injectpublic var myClassInstance:MyClassmapValue(whenAskedFor:Class, instantiateClass:Class, named:String = null)MyClass 的实例被创建和保留,并在被请求的时候被注入. 当此类被请求的时候,这个实例被用来满足这个注入请求. 请注意很重要的一点,因为你已经手动创建并通过 mapValue 映射了一个类实例, 这个实例所需要的依赖将不会被自动注入. 你需要手动或通过 injector 注入这些依赖:injector.injectInto(myClassInstance);这将立即为此实例提供已映射的可以注入的属性。.mapClassmapClass 为每一个注入请求提供这个被映射的类的一个 特有( unique) 实例./你的应用程序中某个映射/配置发生的地方injector.mapClass(MyClass);/在第一个接收注入的类里Injectpublic var myClassInstance:MyClass/在第二个接收注入的类里Injectpublic var myClassInstance:MyClass为上面的每一个注入提供 MyClass 的 特有( unique) 实例来完成请求.mapClass(whenAskedFor:Class, named:String = null)injector 提供了一个方法来实例化被映射的对象:injector.mapClass(MyClass);var myClassInstance:MyClass = injector.instantiate(MyClass);这提供你的对象的一个实例,并填充了此对象包含的所有被映射的注入点(injection points).mapSingletonmapSingleton 为每一个注入请求提供类的一个 单一_(_single) 实例. 为所有映射提供类的单一实例确保你维护一个一致的状态并且不用担心创建被此类的多余实例. 这是一个被框架强制和管理的单一实例, 而不是一个在类内部强制的单例(Singleton)./你的应用程序中某个映射/配置发生的地方injector.mapSingleton(MyClass);/在第一个接收注入的类里Injectpublic var myClassInstance:MyClass/在第二个接收注入的类里Injectpublic var myClassInstance:MyClass在上面的例子里, 两个注入请求都将由被请求类的相同实例填充. 这个注入是被延迟的, 即对象直到第一次被请求才被实例化.mapSingletonOf(whenAskedFor:Class, useSingletonOf:Class, named:String = null)mapSingletonOfmapSingletonOf 在功能上非常像 mapSingleton. 它对映射抽象类和接口很有用, 而 mapSingleton 用来映射具体类实现./你的应用程序中某个映射/配置发生的地方injector.mapSingletonOf(IMyClass, MyClass); /MyClass implements IMyClass/在第一个接收注入的类里Injectpublic var myClassInstance:IMyClass/在第二个接收注入的类里Injectpublic var myClassInstance:IMyClass这个注入方法对创建使用多态的更具可测性的类非常有用. 在下面的 Service 实例 章节可以找到一个例子.MediatorMap 类的依赖注入MediatorMap 实现 IMediatorMap 接口. IMediatorMap 提供两个方法来将你的 mediators 映射到 view 并注册它们以便用来注入.mapView(viewClassOrName:*, mediatorClass:Class, injectViewAs:Class = null, autoCreate:Boolean = true, autoRemove:Boolean = true):voidmapView 接受一个视图类, MyAwesomeWidget, 或者一个视图的类全名, com.me.app.view.components:MyAwesomeWidget 作为第一个参数. 第二个参数是将要作为视图组件中介的 Mediator 类. injectViewAs 内容未完成, 最后的两个参数 autoCreate 和 autoRemove 提供方便的自动管理 mediator 的布尔值开关./在你的程序里某个映射/配置发生的地方mediatorMap.mapView(MyAwesomeWidget, MyAwesomeWidgetMediator); /在 conntextView 的显示列表里的某个地方var myAwesomeWidget:MyAwesomeWidget = new MyAwesomeWidget();this.addChild(myAwesomeWidget); / ADDED_TO_STAGE 事件被抛出, 触发这个视图组件的中介机制这个方法使用了自动中介机制. 手动中介,以及对此方面更深入的内容将稍后在 Mediators 章节中介绍.CommandMap 类的依赖注入CommandMap 类实现 ICommandMap 接口, 提供一个用来将 command 映射到到触发它们的框架事件的方法.mapEvent(eventType:String, commandClass:Class, eventClass:Class = null, oneshot:Boolean = false)你要提供给 commandMap 一个可以执行的类, 执行它的事件类型, 可选的这个事件的强类型, 以及这个 command 是否只被执行一次并且随即取消映射的布尔值开关.这个可选的强类型事件类用来对 Flash 平台的“magic string“事件类型系统做额外的保护.以避免采用相同事件类型字符串的不同事件类之间的冲突./在你的程序里某个映射/配置发生的地方commandMap.mapEvent(MyAppDataEvent.DATA_WAS_RECEIVED, MyCoolCommand, MyAppDataEvent); /在事件被广播的另外一个框架 actor 里/这触发了随后被执行的被映射的 commanddispatch(new MyAppDataEvent(MyAppDataEvent.DATA_WAS_RECEIVED, someTypedPayload)The ContextContext 是所有 Robotlegs 具体实现的中心. 一个 Context, 或者也许多个 Context, 提供其它层进行通讯的机制. 一个应用程序并非只能使用一个 Context, 但大多情况下一个 Context 就足够了. 如果在 Flash 平台上创建模块化应用程序, 多个 Context 就是必须的了. Context 在一个应用程序里有三个功能: 提供初始化, de-initialization 非初始化?, 和用来通讯的事件中心bus.package org.robotlegs.examples.bootstrapimport flash.display.DisplayObjectContainer;import org.robotlegs.base.ContextEvent;import org.robotlegs.core.IContext;import org.robotlegs.mvcs.Context;public class ExampleContext extends Context implements IContextpublic function UnionChatContext(contextView:DisplayObjectContainer)super(contextView);override public function startup():void/这个 Context 只映射一个 command 到 ContextEvent.STARTUP 事件. /这个 StartupCommand 将映射其它将在应用程序里使用的的 command, /mediator, service, 和 model.commandMap.mapEvent( ContextEvent.STARTUP, StartupCommand, ContextEvent, true );/启动应用程序 (触发 StartupCommand)dispatch(new ContextEvent(ContextEvent.STARTUP);MVCS 参考实现Robotlegs 装备了一个参考实现. 这个实现遵照经典的 Model-View-Controller (MVC) 元设计模式, 另外增加了第四个叫做 Service 的 actor. 这些层在本文档中通称为“核心 actor“, 或者简称为“actor“.MVCS 提供一个应用程序的框架概况. 通过将几个经过时间检验的设
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号