模块化示例程序解读
A Modular Sample Application Explained
原文地址:
http://opensource.adobe.com/wiki/display/cairngorm/ModularSampleApplicationExplained
译稿最后修改时间:2010-6-1 16:02
介绍
本文仅是烟水晶框架构建应用程序的一个小小示范。阅读本文前请查看《简单示例程序解读》。
展示的例子是MAX2009会议上的“用Flex框架构建数据驱动型应用程序”主题演示的一部分。客户端代码示例是以烟水晶架构为基础构建和扩展的。关于此次演示的更多信息请查看克里斯多夫克雷茨 的博客。
此处浏览客户端代码。
InsyncModularExtendedShell
InsyncModularExtendedAPI
InsyncModularExtendedContacts
InsyncModularExtendedMessaging
InsyncModularExtendedExpenses
服务器端组件
下载
安装介绍
为了运行示例程序,服务器端组件必须安装。但是对于理解本教程并非必须。
这个示例使用了欧芹程序框架,然而本教程不会深入探讨欧芹框架的特性而是代以烟水晶框架的指导原则的特点。然而,此处概念上的实践可以应用于当前Fash平台上各种各样的应用程序框架。
项目和包结构
InsyncBasic程序仅展示了一个功能区,处置联系人。InsyncModularExtended示例程序关注如何以烟水晶框架推荐俺的方式处理其他功能区域,例如消息和开销,以进一步了解烟水晶框架。模块化的思想将会反映在项目和包的组织方式上。
当烟水晶框架推荐代码以建构层(表现层、应用层、域层、基础层)的方式组织在一起,并且有各自的功能区,功能区之外代码组织功能性更强。InsyncModularExtended是分解在不同的项目内的,每个项目表现独立的功能区,并编译为独立的Flex模块。
另外的外壳项目InsyncModularExtendedShell允许此组程序以将功能区载入至通用UI外壳程序内的方式开始运行,通用外壳程序提供了在各个功能区之前全局导航功能。
一个API项目InsyncModularExtendedAPI用来在不同的功能区之前共享核型可用对象。要注意尽可能少的使用,以最小化相互的依赖和最大化可修改性。
这个项目通过其包裹结构反映出功能区组成。功能区内的全部联系人对象归于联系人包,建构层次放置在功能包之下。
功能区的更多信息请查看模块化开发中的创建功能区。
外壳 – 模块载入和导航
外壳程序定义了在功能区之前导航的通用UI外壳。因为功能区包含在Flex模块之内,外壳程序载入和卸载这些模块利用烟水晶框架的模块类库。实体模块SWF文件引用上下文文件InsyncContext,摘要如下:
<!-- Infrastructure -->
<module:ParsleyModuleDescriptor objectId="contacts"
url="../../insync-modularExtended-contacts/bin-debug/ContactsModule.swf"
domain="{ ClassInfo.currentDomain }" />
并且以通用的可视组件ContentViewStack的InsyncViewLoader进行载入。注意,这个载入组件只需要Flex SDK 的IModuleInfo接口进行注入。
<mx:ViewStack xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:core="insync.core.*"
xmlns:spicefactory="http://www.spicefactory.org/parsley">
<fx:Metadata>
[Waypoint]
</fx:Metadata>
<fx:Script>
<![CDATA[
import insync.application.ContentDestination;
import mx.modules.IModuleInfo;
[Bindable]
[Inject(id="contacts")]
public var contacts:IModuleInfo;
[Bindable]
[Inject(id="messageCompose")]
public var messageCompose:IModuleInfo;
[Bindable]
[Inject(id="expensesModule")]
public var expensesModule:IModuleInfo;
]]>
</fx:Script>
<fx:Declarations>
<spicefactory:Configure/>
</fx:Declarations>
<core:InsyncViewLoader moduleId="{ ContentDestination.CONTACTS }"
automationName="{ ContentDestination.CONTACTS }"
width="100%"
height="100%"
info="{ contacts }"/>
<core:InsyncViewLoader moduleId="{ ContentDestination.MESSAGE_COMPOSE }"
automationName="{ ContentDestination.MESSAGE_COMPOSE }"
width="100%"
height="100%"
info="{ messageCompose }"/>
<core:InsyncViewLoader moduleId="{ ContentDestination.EXPENSES }"
automationName="{ ContentDestination.EXPENSES }"
width="100%"
height="100%"
info="{ expensesModule }"/>
</mx:ViewStack>
这个可视载入组件InsyncViewLoader允许指定方案处置模块载入时发生情况或者载入过程的发生错误。InsyncViewLoader是InsyncModularExtendedAPI项目的一部分,其行为并不仅仅和外壳程序发生关联,也关系到其他功能区的载入下一层组件,所以必须提供一致性的行为。
功能区的独立开发和测试
当程序由多个功能区组成,多个团队能够独立开发外壳程序下独立的不同的功能区,这将减少开发时间。InsyncModularExtendedContacts项目下的ContactsModuleRig能够以最简表单模拟外壳程序来集中联系人功能区域。者不单是为了减少编译和手工测试时间,也能以增加开发者数量的形式提高整个项目的开发效率,项目建立一次即可独立开发,和管理各自独立的功能区之间的依赖。
敏捷测试
整个InsyncModuleExtended项目内,各个独立的功能区都有属于各自的单元测试套件。这是测单元测试套件可以快速运行,这是重要的敏捷单元测试最佳实践。
InsyncModularExtendedContacts项目的测试套件使用了FlexUnit4.浏览ContactsTestRunner可以理解如何使用和在哪里使用。注意单元测试并不测试MXML或者其他可视组件。烟水晶框架推荐将难于测试的可视组件的行为提取到表现模型和域模型内的专用对象。
也要注意单元测试的测试对象的独立性也就是颗粒的缺陷本地化和快速测试组件。如果对象包含依赖,测试就要以mock framework ASMock加倍注入和控制,就像SaveContactCommandTest。Insync测试组件关注于替代对象行为的联系。例如ContactsTest类就是用来测试联系人域的边界检查。
配置和联系不属于单元测试,可以通过功能测试高效进行和实现高覆盖率。当前的Insync示例并没有功能区展示功能测试套件。功能测试套件是非常重要,也是任何企业级Flex程序开发的关键部分。
域可用性验证
InsyncModularExtended项目使用烟水晶可用性验证类库,用来将一般在可视组件内的可用性验证功能抽取和集中在客户端域内。关于域验证的更多信息和可用性验证库的其他特性请单击这里。
错误处置
一个明智的错误捕捉策略能够给RIA系统光明的机会,也就是优雅的回退机制。Insync示例展示了一个通用的用来处置遥控服务返回错误的结构。烟水晶集成类库提供了欧芹标签来定义和处置任意模块内遥控对象的全局错误。InsyncModularExtendedShell项目的AlertHandler类定义仅是在FlexSDK的日志内记录错误日志。
[GlobalRemoteObjectFaultHandler]
public function logError(event:FaultEvent):void
{
LOG.error("A server error occurred. event={0}", event.toString());
}
另外的遥控服务调用的全局错误处理,其他对象的自定义行为执行的遥控服务调用错误。烟水晶集成类库的Command标签提供了一种CommandFault标签用来处置在任何建构层面上的错误。
例如,InsyncModularExtendedContacts项目需要在保存操作失败时显示一个警告框,同时在常规可视组件上显示失败信息。SaveContactCommand在Command对象内直接声明了一个CommandFault。
public function execute(event:ContactEvent):AsyncToken
{
return service.save(event.contact) as AsyncToken;
}
public function result(savedContact:Contact, event:ContactEvent):void
{
cache.updateItem(event.contact, savedContact);
}
public function error():void
{
dispatcher(new AlertEvent("Unable to save the contact."));
}
这个实现(error方法)仅派发一个事件,AlertHandler对象派发一个全局警告可视控件。
[MessageHandler]
public function showAlert(event:AlertEvent):void
{
var text:String = event.text;
if (text == "" || text == null)
{
text = "An error occurred.";
}
Alert.show(text);
}
这个全局警告控件集中定义而且能够更有灵活性的由用户体验团队决定如何更改全局错误处理控件。同时改进了Commands的可测试性。
特别的可视控件上显示失败信息是独立于Command和仅定义在可视控件上的,关于这个看ContactFormPM
[CommandError(selector="save")]
public function onSaveFault(event:ContactEvent):void
{
status="Unable to save contact.";
}
这里就是模块化烟水晶框架建立的程序的示范终点了。可以更自由的在示例内浏览或者在这里进行反馈。我们会进一步的完善这个示例所展现出的特性,用来展示更多的使用烟水晶框架开发企业级Flex程序的真实状况。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/laohliang/archive/2010/06/02/5639763.aspx
A Modular Sample Application Explained
原文地址:
http://opensource.adobe.com/wiki/display/cairngorm/ModularSampleApplicationExplained
译稿最后修改时间:2010-6-1 16:02
介绍
本文仅是烟水晶框架构建应用程序的一个小小示范。阅读本文前请查看《简单示例程序解读》。
展示的例子是MAX2009会议上的“用Flex框架构建数据驱动型应用程序”主题演示的一部分。客户端代码示例是以烟水晶架构为基础构建和扩展的。关于此次演示的更多信息请查看克里斯多夫克雷茨 的博客。
此处浏览客户端代码。
InsyncModularExtendedShell
InsyncModularExtendedAPI
InsyncModularExtendedContacts
InsyncModularExtendedMessaging
InsyncModularExtendedExpenses
服务器端组件
下载
安装介绍
为了运行示例程序,服务器端组件必须安装。但是对于理解本教程并非必须。
这个示例使用了欧芹程序框架,然而本教程不会深入探讨欧芹框架的特性而是代以烟水晶框架的指导原则的特点。然而,此处概念上的实践可以应用于当前Fash平台上各种各样的应用程序框架。
项目和包结构
InsyncBasic程序仅展示了一个功能区,处置联系人。InsyncModularExtended示例程序关注如何以烟水晶框架推荐俺的方式处理其他功能区域,例如消息和开销,以进一步了解烟水晶框架。模块化的思想将会反映在项目和包的组织方式上。
当烟水晶框架推荐代码以建构层(表现层、应用层、域层、基础层)的方式组织在一起,并且有各自的功能区,功能区之外代码组织功能性更强。InsyncModularExtended是分解在不同的项目内的,每个项目表现独立的功能区,并编译为独立的Flex模块。
另外的外壳项目InsyncModularExtendedShell允许此组程序以将功能区载入至通用UI外壳程序内的方式开始运行,通用外壳程序提供了在各个功能区之前全局导航功能。
一个API项目InsyncModularExtendedAPI用来在不同的功能区之前共享核型可用对象。要注意尽可能少的使用,以最小化相互的依赖和最大化可修改性。
这个项目通过其包裹结构反映出功能区组成。功能区内的全部联系人对象归于联系人包,建构层次放置在功能包之下。
功能区的更多信息请查看模块化开发中的创建功能区。
外壳 – 模块载入和导航
外壳程序定义了在功能区之前导航的通用UI外壳。因为功能区包含在Flex模块之内,外壳程序载入和卸载这些模块利用烟水晶框架的模块类库。实体模块SWF文件引用上下文文件InsyncContext,摘要如下:
<!-- Infrastructure -->
<module:ParsleyModuleDescriptor objectId="contacts"
url="../../insync-modularExtended-contacts/bin-debug/ContactsModule.swf"
domain="{ ClassInfo.currentDomain }" />
并且以通用的可视组件ContentViewStack的InsyncViewLoader进行载入。注意,这个载入组件只需要Flex SDK 的IModuleInfo接口进行注入。
<mx:ViewStack xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:core="insync.core.*"
xmlns:spicefactory="http://www.spicefactory.org/parsley">
<fx:Metadata>
[Waypoint]
</fx:Metadata>
<fx:Script>
<![CDATA[
import insync.application.ContentDestination;
import mx.modules.IModuleInfo;
[Bindable]
[Inject(id="contacts")]
public var contacts:IModuleInfo;
[Bindable]
[Inject(id="messageCompose")]
public var messageCompose:IModuleInfo;
[Bindable]
[Inject(id="expensesModule")]
public var expensesModule:IModuleInfo;
]]>
</fx:Script>
<fx:Declarations>
<spicefactory:Configure/>
</fx:Declarations>
<core:InsyncViewLoader moduleId="{ ContentDestination.CONTACTS }"
automationName="{ ContentDestination.CONTACTS }"
width="100%"
height="100%"
info="{ contacts }"/>
<core:InsyncViewLoader moduleId="{ ContentDestination.MESSAGE_COMPOSE }"
automationName="{ ContentDestination.MESSAGE_COMPOSE }"
width="100%"
height="100%"
info="{ messageCompose }"/>
<core:InsyncViewLoader moduleId="{ ContentDestination.EXPENSES }"
automationName="{ ContentDestination.EXPENSES }"
width="100%"
height="100%"
info="{ expensesModule }"/>
</mx:ViewStack>
这个可视载入组件InsyncViewLoader允许指定方案处置模块载入时发生情况或者载入过程的发生错误。InsyncViewLoader是InsyncModularExtendedAPI项目的一部分,其行为并不仅仅和外壳程序发生关联,也关系到其他功能区的载入下一层组件,所以必须提供一致性的行为。
功能区的独立开发和测试
当程序由多个功能区组成,多个团队能够独立开发外壳程序下独立的不同的功能区,这将减少开发时间。InsyncModularExtendedContacts项目下的ContactsModuleRig能够以最简表单模拟外壳程序来集中联系人功能区域。者不单是为了减少编译和手工测试时间,也能以增加开发者数量的形式提高整个项目的开发效率,项目建立一次即可独立开发,和管理各自独立的功能区之间的依赖。
敏捷测试
整个InsyncModuleExtended项目内,各个独立的功能区都有属于各自的单元测试套件。这是测单元测试套件可以快速运行,这是重要的敏捷单元测试最佳实践。
InsyncModularExtendedContacts项目的测试套件使用了FlexUnit4.浏览ContactsTestRunner可以理解如何使用和在哪里使用。注意单元测试并不测试MXML或者其他可视组件。烟水晶框架推荐将难于测试的可视组件的行为提取到表现模型和域模型内的专用对象。
也要注意单元测试的测试对象的独立性也就是颗粒的缺陷本地化和快速测试组件。如果对象包含依赖,测试就要以mock framework ASMock加倍注入和控制,就像SaveContactCommandTest。Insync测试组件关注于替代对象行为的联系。例如ContactsTest类就是用来测试联系人域的边界检查。
配置和联系不属于单元测试,可以通过功能测试高效进行和实现高覆盖率。当前的Insync示例并没有功能区展示功能测试套件。功能测试套件是非常重要,也是任何企业级Flex程序开发的关键部分。
域可用性验证
InsyncModularExtended项目使用烟水晶可用性验证类库,用来将一般在可视组件内的可用性验证功能抽取和集中在客户端域内。关于域验证的更多信息和可用性验证库的其他特性请单击这里。
错误处置
一个明智的错误捕捉策略能够给RIA系统光明的机会,也就是优雅的回退机制。Insync示例展示了一个通用的用来处置遥控服务返回错误的结构。烟水晶集成类库提供了欧芹标签来定义和处置任意模块内遥控对象的全局错误。InsyncModularExtendedShell项目的AlertHandler类定义仅是在FlexSDK的日志内记录错误日志。
[GlobalRemoteObjectFaultHandler]
public function logError(event:FaultEvent):void
{
LOG.error("A server error occurred. event={0}", event.toString());
}
另外的遥控服务调用的全局错误处理,其他对象的自定义行为执行的遥控服务调用错误。烟水晶集成类库的Command标签提供了一种CommandFault标签用来处置在任何建构层面上的错误。
例如,InsyncModularExtendedContacts项目需要在保存操作失败时显示一个警告框,同时在常规可视组件上显示失败信息。SaveContactCommand在Command对象内直接声明了一个CommandFault。
public function execute(event:ContactEvent):AsyncToken
{
return service.save(event.contact) as AsyncToken;
}
public function result(savedContact:Contact, event:ContactEvent):void
{
cache.updateItem(event.contact, savedContact);
}
public function error():void
{
dispatcher(new AlertEvent("Unable to save the contact."));
}
这个实现(error方法)仅派发一个事件,AlertHandler对象派发一个全局警告可视控件。
[MessageHandler]
public function showAlert(event:AlertEvent):void
{
var text:String = event.text;
if (text == "" || text == null)
{
text = "An error occurred.";
}
Alert.show(text);
}
这个全局警告控件集中定义而且能够更有灵活性的由用户体验团队决定如何更改全局错误处理控件。同时改进了Commands的可测试性。
特别的可视控件上显示失败信息是独立于Command和仅定义在可视控件上的,关于这个看ContactFormPM
[CommandError(selector="save")]
public function onSaveFault(event:ContactEvent):void
{
status="Unable to save contact.";
}
这里就是模块化烟水晶框架建立的程序的示范终点了。可以更自由的在示例内浏览或者在这里进行反馈。我们会进一步的完善这个示例所展现出的特性,用来展示更多的使用烟水晶框架开发企业级Flex程序的真实状况。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/laohliang/archive/2010/06/02/5639763.aspx