Cairngorm 2.1前阵子在MAX2006中发布了,今天我们来仔细查看2.1到底有那些变化,并给出2.1版本的基于cairngorm的应用开发示例,希望能对您的cairngorm旅程有些帮助…

Cairngorm 2.1前阵子在MAX2006中发布了,今天我们来仔细查看2.1到底有那些变化,并给出2.1版本的基于cairngorm的应用开发示例,希望能对您的cairngorm旅程有些帮助。

相对2.0版本来说,2.1版本最大的变化就是com.adobe.cairngorm.business.Responder接口的退役,而mx.rpc.IResponder接口的粉墨登场。为什么要用IResponder替代原来的Responder接口呢,darron schall的这篇《Why I don’t use Cairngorm’s Responder》对此有非常详细的叙述,简单的来说,有以下几点好处:

  1. IResponder是Flex2框架的一部分
  2. IResponder与mx.rpc包中的其他组件有更好的交互性,特别是:AsyncToken
  3. IResponder可以添加多个数据返回响应监听,而之前的Responder接口每次只能有一个方法响应数据的返回:
  4. [actionscript]
    //In RemoteDelegate.as:
    public function makeRemoteCall():void
    {
          // 注意这里...
          var call:AsyncToken = service.aRemoteMethod();
          call.resultHandler = responder.onResult;
          call.faultHandler = responder.onFault;
    }
    

  5. 原来的Cairngorm Response接口实现中,在RemoteService中需要一些非类型安全的硬编码,并且这些编码会造成某些运行时错误:
  6. [xml]
    // In Services.mxml
    <mx:RemoteObject id="someService"
          result="event.token.resultHandler( event )"
          fault="event.token.faultHandler( event )" ... />
    

所以,为了解决后面两点的问题,Cairngorm框架使用IResponder替代了Responder,相应的我们的Comand就需要实现IResponder的下面两个方法:

[actionscript]
public function fault(info:Object):void
public function result(data:Object):void

然后在RemoteDelegate中使用如下的方法添加监听就可以了:

[actionscript]
public function remoteCall(URL:String):void
{
      service.url=URL;
      var token:AsyncToken=service.send();
      token.addResponder( responder );
      //这里可以添加多个Responder...
}

2.1其他的变化还有Command被ICommand接口取代,不像之前的Command接口,ICommand接口定义了一个方法来规范Command调用方法的编写:

[actionscript]public function execute(event:CairngormEvent):void

还有的就是ValueObject对象被com.adobe.cairngorm.vo.IValueObject取代了,详细的2.1的变化清单如下:

  • Responder has been deprecated. Use mx.rpc.IResponder*
  • Command has been deprecated. Use com.adobe.cairngorm.commands.ICommand*
  • ValueObject has been deprecated. Use com.adobe.cairngorm.vo.IValueObject*
  • ServiceLocator.getService() has been deprecated. Use ServiceLocator.getRemoteObject( string )*
  • ServiceLocator.getInvokerService() has been deprecated.*
  • IServiceLocator interface has been created to support unit testing
  • ServiceLocator has security methods added
  • FrontControler.executeCommand() and getCommand() visibility has been changed to protected
  • Error messages have been internationalized

最后,我写了个基于Cairngorm 2.1的示例,该示例的功能很简单,就是访问远端的一个xml文件,将其内容显示出来,这样的功能非常简单,根本就没必要用Cairngorm实现,但是为了我们演示代码的简洁性、易懂性,为了更好的让大家专注于Cairngorm 2.1的实现,我还是选择了这样一个非常简单、对于Cairngorm来说大材小用的案例:

点击查看示例

立刻查看示例|下载源代码