更新日期:2010年8月5日
1.Module类库简介Cairngorm Module类库用于简化配置文件,加载module文件。与module的交互。
本类库包含框架类,视图组件,一个通过parsley的消息的加载和交互机制。
组件化最方便之处在于缩小SWF的大小,尽管这种方法很有效,但是开发人员必须要考虑好功能模块的封装等设计问题。一个模块可以独立的开发、测试,基于合约的方法可以保证不同模块之间的一致性。module可以互相提供服务。一个module的执行可能在不影响其它module的情况下发生改变。
Flex SDK提供了ModuleLoader 视图组件加载module。ModuleManager 可以提供手工的管理。IModuleInfo 接口抽象了加载和卸载方法。
Cairngorm Module类库提供了Flex SDK 和 Parsley之外的特征:
* module配置信息的外部声明,module的URL可以在MXML中声明或从XML文件中运行时加载。
* modules 的延后加载,比如一个StartChatMessage 消息派发后,Chat module才加载和初始化,StartChatMessage 消息再接着执行。
* 消息的路由范围设置(比如派发给所有modules,一种类型的所有modules,或者一个特殊的module实例)
2.module配置信息2.1静态配置ParsleyModuleDescriptor 用于描述module的location 和 application domain ,可以在Parsley MXML 或 XML 文件中描述。
当通过MXML文件配置module时,创建parsley的上下文时,要使用CairngormModuleSupport :
接下来,在MXML中描述module:
objectId="moduleA"
url="example/moduleA/ModuleA.swf"
domain="{ ClassInfo.currentDomain }"/>
2.2动态配置
通过XML配置module,可以在运行时加载。通过CairngormModuleXMLSupport 标签在ContextBuilder中附加XML文件信息:
然后,在XML文件内描述module
xmlns=""
xmlns:cairngorm=""
xmlns:xsi=""
xsi:schemaLocation="
/schema/2.0/parsley-core.xsd">
object-id="moduleA"
url="example/moduleA/ModuleA.swf"/>
3.module渲染
使用渲染必须在ParsleyModuleDescriptor中设置module的objectId,如下所示
objectId="moduleA"
url="example/moduleA/ModuleA.swf"/>
然后,通过IModuleManager 接口加载module
import com.adobe.cairngorm.module.IModuleManager;
[Inject(id="moduleA")]
public var moduleManager:IModuleManager;
]]>
moduleManager="{ moduleManager }"
skinClass="com.adobe.cairngorm.module.ModuleViewLoaderSkin">
一旦module通过IModuleManager 接口被注入到视图中,module通过ModuleViewLoader 组件开始加载。skinClass 用于在加载和错误状态下定义显示样式。
4.延时加载
只有事件被派发到module时,nodule才加载并初始化以接收事件。
开发人员需要在context中用ModuleMessageInterceptor标签定义一个事件。比如,对于moduleA,需要派发事件BroadcastMessage 才开始加载
type="{ BroadcastMessage }" moduleRef="moduleA" />
对于已加载的nodule接收消息,module需要实现IParsleyModule接口。并且在context中指明接收的消息
xmlns:spicefactory=""
implements="com.adobe.cairngorm.module.IParsleyModule" >
import com.adobe.cairngorm.module.IParsleyModule;
import org.spicefactory.parsley.flex.FlexContextBuilder;
public function get contextBuilder():ContextBuilderTag
{
return contextBuilderTag;
}
]]>
现在,在ModuleAContext 上下文中,任何对象都可以接收module的消息
[MessageHandler(scope="local")]
public function broadcastMessageHandler(message:BroadcastMessage):void
{
5.模块间相互通信
一个application可能存在一个module的多个实现。module library可以控制loader和多个module之间,或者多个module之间的通信。
例1:派发消息给一个module对应的所有实例
objectId="moduleA"
url="example/moduleA/ModuleA.swf" />
type="{ BroadcastMessage }" moduleRef="moduleA" />
例2:派发消息给所有module的所有实例
type="{ ClearLogMessage }" />
例3:派发消息给一个module对应的一个实例
为了将消息派发给特定的实例,可以在ModuleMessageInterceptor 标签中设置属性ModuleId 来完成。
public class PingMessage
{
private var _moduleId:String;
public function PingMessage(moduleId:String)
{
this._moduleId = moduleId;
}
[ModuleId]
public function get moduleId():String
{
return _moduleId;
}
}
ModuleId 的值为 ViewLoader 组件的属性。
参考文献
1.How To Use Cairngorm Module .
阅读(2176) | 评论(0) | 转发(1) |