现在的位置: 首页 > 综合 > 正文

【转】Cairngorm MVC 学习笔记

2014年01月31日 ⁄ 综合 ⁄ 共 7236字 ⁄ 字号 评论关闭

 转载地址:http://hi.baidu.com/lyno/blog/item/8f025c2cffac15e68b139934.html

 

什么是Cairngorm?


Cairngorm(中文名:“烟水晶”?)是一个轻量级的Flex RIA程序开发框架,从而使程序可扩展性、可维护性都大大提高,其本身并不是一个完整的企业应用,它只是提供了一个开发骨架,Adobe称之为体系。


Cairngorm体系 


主要包括以下几个部分:


1、VO(Value Object)


IValueObject 和 ValueObject 只是为了提高VO类的可读性,表示该类是一个ValueObject类,其它没有任何实际作用。其可能是为将来而设计的,我们在应用过程中不需要实现任何接口函数。


2、Model


定义了ModelLocator接口,我们只需要实现该接口,把所需要绑定的数据保存在这里。通常我们都采用单例模式(Singleton Pattern)来实现,并按照项目模块进行分类,避免把整个项目的所有数据都保存在一个类文件中。换句话说,ModelLocator是整个系统的数据中心。 


3、View 


有ViewHelper.as 和 ViewLocator.as,在Cairngorm2.2.1版本中已被废除。


4、Commands 


定义了ICommand接口,该接口定义了一个唯一需要实现的方法execute(),这其实就是典型的命令模式,我们只要实现此接口,并不需要关心其具体实现方式。


5、Control


含三个基类:CairngormEvent、CairngormEventDispatcher和FrontController。 

(1)CairngormEvent:

继承flash.events.Event,其包含一个data成员,用来传递参数数据之用。

(2)CairngormEventDispatcher:

采用单例模式(Singleton Pattern),用来广播用户发起的自定义动作事件。

(3)FrontController:

相当于控制中心,在这里你要做的工作是将事件(CairngormEvent)和命令(Command)之间的映射关系注册在它的

成员commands(Dictionary类型)中,通过下面的类似方法进行注册:

addCommand( GetProductsEvent.EVENT_GET_PRODUCTS, GetProductsCommand );

以后,凡是CairngormEventDispatcher广播出来的事件,首先都会在这里查找,找到对应的event对应的command后,

便执行Command的execute()方法。

FrontController必须要在你的系统中实例化,具体的实例化方法如下:

1 <mx:Application xmlns:control="com.domain.projectname.control.ShopController">

2 ...

3 <control:ShopController id="controller" />

4 ...

5 </mx:Application>


6、Business 


IServiceLocator接口: 

提供了HTTPService、WebSercice、RemoteObject三种RPC服务。使用时候,将需要的RPC服务登记在该接口中,

以mxml形式采用单例模式(Singleton Pattern)实现IServiceLocator,如下面使用例子:


1 <cairngorm:ServiceLocator

2 xmlns:mx="http://www.adobe.com/2006/mxml

3 xmlns:cairngorm="http://www.adobe.com/2006/cairngorm">



5 <mx:RemoteObject id="productService" destination="productServiceImpl" showBusyCursor="true">

6 </mx:RemoteObject>



8 <mx:RemoteObject id="creditCardService" destination="creditCardServiceImpl" showBusyCursor="true">

9 </mx:RemoteObject>

10 

11 <mx:HTTPService id="XXXService" url="URL" showBusyCursor="true" useProxy="false" resultFormat="e4x">

12 </mx:HTTPService>

13 

14 </cairngorm:ServiceLocator>


需要在系统中实例化,具体的实例化方法如下: 


1 <mx:Application xmlns:business="com.adobe.cairngorm.samples.store.business.*">

2 ...

3 <business:Services id="services" />

4 ...

5 </mx:Application>


在某个Delegate类中的使用方法:


1 this.service = ServiceLocator.getInstance().getRemoteObject( "productService" );


之后,就可以进行相关的函数调用了。

 



(1)前端控制器(FrontController)监听用户行为 


前端控制品是Cairngorm事件的唯一监听者,但其不并做任何操作,只是集中注册并管理事件(Event)与命今(Command)的映射关系。


(2)命令(Commands)执行所有用户操作


前端控制品(FrontController)监听到事件与命令有匹配时,便告诉命令(Commmands)调用execute()方法处理事件。


(3)服务器端业务逻辑委托给Business Delegate


当命令(Commands)执行时,它只是关心是否获取到数据,而并不关心获取到什么具体数据。因为经常需要从服务器端获取数据,此时命令(Commands)更喜欢把它委托给其它类去操作。所以需要处理服务器端业务逻辑的时候,你都可以委托给命令(Commands)可以调用的Business Delegate类去处理。


(4)Business Delegate在Service Locator中寻找RPC Services 


Business Delegate给命令(Commands)和RPC Services提供一个无缝接口。Business Delegate通过查找和匹配 PRC Services的名称来调用services并返回结果给命令(Commands)。命令(Commands)要从Business Delegate获取返回结果数据必须通过IResponder接口(mx.rpc.IResponder),只有这样Business Delegate才知道命命令(Commands)有onResult()和onFault()来处理返回的数据。


(5)把数据存储为Value Objecs


强烈推荐把数据存储为Value Objects。


(6)在Model Locator保存状态并且让Model通知View 


Model Locator是一个保存应用程序全部状态和包含Value Objects的地方。当应用程序状态改变时,Moel Locator 通过Data Binding方式来通知View改变。



Caringorm控制流程


当Caringorm应用程序增加新需求时,下面是一个简单的操作步聚: 


(1)创建或修改Value Objects; 


(2)在Front Controller中使用AddCommand()方法注册新的事件(Event)和命令(Command)的映射关系。 


(3)创建新的命令(Command): 


            A)实现execute()方法; 


            B)实现处理从服务器端返回数据的onResult()方法 


                        i)更新Model Locator的结果; 


                        ii)Model Locator自动通知View显示。 


(4)增加命令(Command)委托Business Delegate的服务调用; 


(5)如果需要新的RPC Services,添加至Service Locator。 


调试Caringorm应用程序步聚 


当Caringorm程序功能,不能正常响应时,一般按以下五个步聚操作调试: 


(1)检查Front Controller是否已经注册事件; 


(2)检查Command中的execute()是否已经被Controller调用; 


(3)检查是否正确调用委托方法; 


(4)检查Command中的onResult()是否已经被调用; 


(5)检查Model Locator是否已经更新。

 

 

一、使用WebService


在Services.mxml中你须建立WebService服务,如:


1 <mx:WebService id="自定义ID" wsdl="{您的wsdl地址}" useProxy="false">

2 <mx:operation name="wsdl中的方法名"/>

3 </mx:WebService>




1 <mx:webservice>

2 id="自定义ID"

3 wsdl="{您的wsdl地址}"

4 useProxy="false">

5 <mx:operation concurrency="multiple" name="wsdl中的方法名1" />

6 <mx:operation concurrency="multiple" name="wsdl中的方法名2" />

7 </mx:webservice>


其实和平常定义的WebService没有两样,只是不须添加<mx:request>标签。


在AS3中的调用方法,如:


1 package cn.soave.flexblog.business

2{

3 import com.adobe.cairngorm.business.ServiceLocator;



5 import mx.rpc.IResponder;



7 public class BlogDelegate

8 {

9 private var service:Object;

10 private var responder:IResponder

11 

12 public function BlogDelegate(responder:IResponder)

13 {

14 this.responder = responder;

15 }

16 

17 /*获取最新更新的博客文章列表*/

18 public function getLastBlogList(参数1,参数2):void

19 {

20 this.service = ServiceLocator.getInstance().getWebService("自定义的WebService标签ID");

21 var call:AsyncToken= this.service.WebService中的方法名(参数1,参数2);

22 call.addResponder(this.responder);

23 }

24 

25 }

26 }

二、使用HTTPService

在Services.mxml中你须建立HTTPService服务,如:


1 <mx:httpservice id="自定义标识ID" url="您的网页URL" showBusyCursor="true" method="POST" resultFormat="text"/>


在AS3中调用的方法,如:


1 package cn.soave.flexblog.business

2{

3 import com.adobe.cairngorm.business.ServiceLocator;



5 import mx.rpc.AsyncToken;

6 import mx.rpc.IResponder;



8 public class BlogDelegate

9 {

10 private var service:Object;

11 private var responder:IResponder

12 

13 public function BlogDelegate(responder:IResponder)

14 {

15 this.responder = responder;

16 }

17 

18 public function getUser():void

19 {

20 this.service = ServiceLocator.getInstance().getHTTPService("自定义的HTTPService标签ID");

21 var call:AsyncToken = this.service.send({参数1,参数2,...});

22 call.addResponder(this.responder);

23 }

24 

25 }

26 }

备注:

处理正常或异常结果的Responder接口

Responder接口定义了两个抽象的方法:onResult方法和onFault方法

package{

   public interface Responder{

    function _disibledevent= null):void;

    function _disibledevent= null):void;

}

}

查找服务的ServiceLocator类

ServiceLocator类用于查找服务,如<mx:HTTPService>、<mx:WebService>等。

getService     获取AbstractService服务

getInvokerService   获取AbstractInvoker服务

getRemoteObject    获取RemoteObject服务

getHTTPService    获取HTTPService服务

getWebService    获取WebService服务

getDataService    获取DataService服务

getServices     获取AbstractInvoker服务数组

getHTTPServices    获取HTTPService服务数组

getDataServices    获取DataService服务数组

其中,getService方法的有点是可以获得任何类型服务,缺点是效率不高。

public function getService(serviceId:String): AbstractService{

   return AbstractService(getServiceForId(serviceId));

}

ServiceLocator类中还定义对服务设置的方法,如setMessageAgentCredentials、setHTTPServiceCredentials等。

处理事件的Command类

Command类继承于ICommand接口,用于处理某一事件。ICommand接口中定义了execute抽象方法,用于执行相应处理。

创建事件的CaringormEvent类

CaringormEvent类用于定义用户事件。包含一个成员变量data和一个构造函数。data变量可以存储任何类型的数据。

管理事件的CaringormEventDispatcher类用于管理事件。

getInstance     获取累的一个实例

addEventListener    添加事件监听

removeEventListener   移除事件监听

dispatchEvent     广播事件

hasEventListener    是否有事件监听

willTrigger     是否可以触发

监听事件的FrontController类

FrontController类用于监听事件。一旦事件发生,前台控制器找到事件的相应处理命令类执行。

addCommand     监听事件,并添加事件的处理命令

executeCommand    执行命令

getCommand     获得命令

存储数据模型的ModelLocator类

ModelLocator类是一种接口,用于应用程序的数据模型。可将应用程序需要显示的数据及状态变量都定义在ModelLocator类中。ModelLocator类相当于应用程序的“数据库”,方便修改与删除。

辅助操作视图的ViewHelper类

ViewHelper类用于辅助操作视图。使用ViewHelper类可在as文件中修改其他MXML文件中的视图。ViewHelper类中定义了两个成员变量:view和id。view变量为Object类型,存储了使用ViewHelper类的MXML文件的全部组件视图。id变量为ViewHelper类的标识符。

initialized     初始化ViewHelper,包括view和id变量。

registerView    注册试图

unregisterView    撤销注册视图

查找视图的viewLocator类

viewLocator类用以查找视图,即查找ViewHelper类的实例。

getInstance     获取viewLocator类实例

register     注册视图

unregister     取消注册视图

getViewHelper    根据ViewHelper类id获取ViewHelper类实例

registrationExistsFor 视图是否已注册

定义数据模型的ValueObject类

ValueObject类继承于IValueObject类,而IValueObject接口主要用于定义数据模型。

 

抱歉!评论已关闭.