Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3336828
  • 博文数量: 530
  • 博客积分: 13360
  • 博客等级: 上将
  • 技术积分: 5473
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-13 13:32
文章分类

全部博文(530)

文章存档

2017年(1)

2015年(2)

2013年(24)

2012年(20)

2011年(97)

2010年(240)

2009年(117)

2008年(12)

2007年(8)

2006年(9)

分类:

2010-08-05 15:38:08

更新日期: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) |
给主人留下些什么吧!~~