浅析 robotlegs2

当前阅读版本: 2.0.0b3. https://github.com/robotlegs/robotlegs-framework 源代码中有readme文档,阅读readme可以了解整个程序的大致结构.

1 概述

robotlegs2比 1.5 的结构更加灵活,但是额外加了两个依赖包:

image

重构后robotlegs2分为四个部分 :

  1. 核心framework,包括:容器(Context) ,配置管理器(Configuration manager),扩展管理(Extension installer),两个新的状态对象(Guards and hooks) ,生命周期管理(Lifecycle),日志(Logging)
  2. 扩展 :包括了 m v c 的管理器,日志扩展,事件中心等等。
  3. 扩展包(Bundles): 实现的只有一个MVCSBundle,顾名思义是MVC的扩展组合 .
  4. MXML支持
2 容器解析

RobotLegs的核心类是Context 管理整个程序的生命周期,和 puremvc 的Facade 有点类似的味道.

我们先来创建一个简单的容器,再分析创建容器具体做了一些什么.

_context = new Context()
.install(MVCSBundle)
.configure(
AppConfig,
new ContextView(this));

这句代码就是创建一个容器上下文,并且装载mvc扩展包,添加一些自定的配置,将主视图初始化. Context初始化调用的方法

private function setup():void
{
_injector.map(Injector).toValue(_injector);
_injector.map(IContext).toValue(this);
_logger = _logManager.getLogger(this);
_lifecycle = new Lifecycle(this);
_configManager = new ConfigManager(this);
_extensionInstaller = new ExtensionInstaller(this);
beforeInitializing(beforeInitializingCallback);
afterInitializing(afterInitializingCallback);
beforeDestroying(beforeDestroyingCallback);
afterDestroying(afterDestroyingCallback);
}

大概操作为:绑定注入器,绑定上下文,为容器提供日志,生命周期对象 ,配置管理,扩展安装类,后面几个是执行几个回调.

MVCSBundle 装载

public function extend(context:IContext):void
{
context.logLevel = LogLevel.DEBUG;
context.install(
TraceLoggingExtension,
VigilanceExtension,
InjectableLoggerExtension,
ContextViewExtension,
EventDispatcherExtension,
ModularityExtension,
CommandCenterExtension,
EventCommandMapExtension,
LocalEventMapExtension,
ViewManagerExtension,
StageObserverExtension,
ManualStageObserverExtension,
MediatorMapExtension,
StageSyncExtension);
context.configure(ContextViewListenerConfig);
}

image

写了个关于下拉切换图片的demo,还发邮件给作者 Shaun Smith 问了个低级问题:怎么样在初始化容器后派发事件来启动框架,Shaun Smith 让我把问题提交到http://knowledge.robotlegs.org/discussions/robotlegs-2/ ,在这找到了答案,在你的config里面里就可以使用容器上下文,和事件派发器了:

package com.far.robotlegs2
{
import com.far.robotlegs2.commands.GetDataCommand;
import com.far.robotlegs2.common.view.ImageSelect;
import com.far.robotlegs2.common.view.ImageShow;
import com.far.robotlegs2.events.AppEvent;
import com.far.robotlegs2.mediators.ImageSelectMediator;
import com.far.robotlegs2.mediators.ImageShowMediator;
import com.far.robotlegs2.models.ImageModel;
import flash.display.DisplayObjectContainer;
import flash.events.IEventDispatcher;
import robotlegs.bender.extensions.contextView.ContextView;
import robotlegs.bender.extensions.eventCommandMap.api.IEventCommandMap;
import robotlegs.bender.extensions.mediatorMap.api.IMediatorMap;
import robotlegs.bender.framework.api.IContext;
public class AppConfig
{
[Inject]
public var eventDispatcher:IEventDispatcher;
[Inject]
public var contextview:ContextView;
[Inject]
public var mediatorMap:IMediatorMap;
[Inject]
public var commandMap:IEventCommandMap;
[Inject]
public var context:IContext;
public function AppConfig()
{
}
[PostConstruct]
public function start():void
{
context.injector.map(ImageModel).toSingleton(ImageModel);
mediatorMap.map(ImageSelect).toMediator(ImageSelectMediator);
mediatorMap.map(ImageShow).toMediator(ImageShowMediator);
commandMap.map(AppEvent.GETDATA,AppEvent).toCommand(GetDataCommand);
addImageSelect(contextview.view);
addImageShow(contextview.view);
eventDispatcher.dispatchEvent(new AppEvent(AppEvent.GETDATA));
}
public function addImageSelect(container:DisplayObjectContainer):ImageSelect
{
return new ImageSelect(container);
}
public function addImageShow(container:DisplayObjectContainer):ImageShow
{
var imshow:ImageShow=new ImageShow();
imshow.y=50;
container.addChild(imshow);
return imshow;
}
}
}

还要注意的是Mediator的onRegister 在2里面是initialize. robotlegs2还在开发中,希望作者尽快出来正式版.这段时间会仿着写个更轻量的框架.