Prana Framework力推ActionScript 3应用开发

作者 Moxie Zhang  译者 张龙

Prana是一个面向Adobe Flex及ActionScript 3的控制反转(Inversion of Control,即IoC)应用框架。InfoQ最近采访了Prana Framework的创建者Christophe Herreman和Damir Murat以深入了解该框架的使用。

InfoQ:您能否向InfoQ的读者说明一下当初为何在其他控制反转应用框架已经存在的前提下还要开发Prana呢?

Herreman:Prana诞生于我们开始重写之前用ActionScript 2和Flash开发的一个在线学习平台之际。我们使用的一个库是来自于as2lib的IoC容器,由于之前IoC对我们的工作提供了巨大的帮助,因此我们想在自己的这个新平台上也添加同样的功能。那时还没有ActionScript 3的IoC容器,所以我打算自己开发一个。

我以一个自己的实现(基于Spring XML方言)开始,但很快我就决定尽可能地以Spring提供的代码作为基础。这样做更容易实现某些特性,因为可以参考Spring的源码;熟悉 Spring的开发者使用Prana时会很容易上手,当然我也借此机会更深入地学习Spring的内核。

InfoQ:您认为Prana framework最突出的特点是什么?

Herreman:它是一个通用、可扩展、功能强大的IoC容器。如果你了解Spring IoC容器,那么你就会清楚Prana能做些什么。

它有一个很棒的特性:你可以向其XML解析器中增加自定义的预处理器。预处理器用来转换已加载但尚未解析的XML。接下来,你可以增加新的元素和属性以方便地描述自定义对象,同时还可以让自定义的预处理器将元素转化为Prana解析器可以理解的形式。

除了IoC容器,Prana还有一个构建于describeType()之上的Reflection API。这样你就可以在运行时获得对象的信息,比如对象包含的属性和方法以及实现的接口等等。接下来,我们还为领域对象创建了一些基础类(这是从Eric Evans的Domain-Driven Design一书中得到的灵感)。这些基础类具有比较和克隆对象等逻辑。Prana还包含几个有用的帮助类。

Murat:Prana还提供了一些工具,这些工具可用来快速建立基于Prana的项目。其中一个主要特性就是动态更新Flex编译器的配置信息以包含编译好的swf中的类,而这些类是无法通过代码访问的。这在IoC系统中很常见,因为IoC鼓励面向接口(而不是类)编程。我们的工具与Eclipse/Flex Builder紧密集成,同时他们可以检测到Prana的配置信息何时发生了变化,如果需要的话,他们就会解析Prana的配置并相应地更新flex编译器设置。当程序员必须显式声明无法通过代码访问的类以将其包含在最终编译好的swf中时,这种方式就无需再使用典型的flex“模式”了。我们的工具会自动完成这些事情。

还有其他一些特性,如预定义的项目布局、定义好的Ant target,对subversion的支持等等。所有这些特性都是可配置的,并可通过几个步骤轻松搞定。开发者可以查看prana-tools项目(从svn或是分发包中都可以得到)以了解感兴趣的信息。

InfoQ: Prana集成了Cairngorm和PureMVC。您能否说明一下Prana为什么要与这两个框架集成,并且是如何实现集成的?

Herreman:我们为Cairngorm和PureMVC提供了一套扩展。因为我们使用了IoC,所以我们还想将该原理应用到我们正在使用的框架上,同时我们想用依赖注入(Dependency Injection,即DI)对应用的不同部分进行包装。

我们为Cairngorm提供了一个可配置在IoC容器中的服务定位器。你可以在外部定义远程对象、channelsets、consumers等,并可以改变他们而无需重新编译应用。通过这种方式,你也无需编译services-config.xml文件并可以轻松地将其部署到不同的地方。它还使测试变得更简单。典型的例子就是当你从开发机器迁移到测试或是产品服务器上时,你得改变端点(endpoints)。Prana使这一切变得简单,你无需重新构建应用。

我们提供的frontcontroller是Cairngorm frontcontroller的一个子类,它接收定制的命令工厂。通过这种方式,你可以控制命令创建的方式,一旦命令创建好后,你就可以将额外的属性注入到命令中。除此以外,我们还支持链式的事件/命令,这样你就无需显式地从另一个命令中调用命令了。

Murat:与PureMVC的集成最初只是一种实验性的尝试,用来将IoC带到PureMVC应用中。后来发现这是可行的,于是我们就将这项工作公开了。

对于PureMVC用户来说,主要的好处是当遇到依赖时可以使用依赖注入。同时这也是最大的缺点,因为DI的使用不可避免地会改变一些原始的 PureMVC使用习惯,而这些习惯是基于服务定位器模式的。然而我们相信DI对任何应用都是很有帮助的,PureMVC也不例外。为了减轻移植到DI的代价,我们尽可能简化Prana的PureMVC集成。例如,PureMVC开发者可以选择一个DI的应用范围。Prana只能用来管理非PureMVC 对象,或者说它只能用来管理部分PureMVC类,当然它可以管理应用中的PureMVC对象和非PureMVC对象。

InfoQ:能不能推荐一下使用Prana的最佳方式(或者是应用类型)?

Herreman:如果你需要在应用中保持一定程度的灵活性以便其可以运行在不同的上下文中,或者是你拥有大量的配置,想要集中管理他们,那么我极力推荐使用Prana。因为它基于Spring,很多开发者已经熟悉了其概念和XML方言。

就我们的情况来说,我们已经创建了一个在线学习平台,用户可以定制其自己的需求。因为我们自己管理该平台,所以需要有一种机制以允许所有这些定制。如果没有IoC,我们就不得不对每个定制编译不同的软件版本,或者是我们必须编写一个基于XML或者是数据库的客户配置系统,而对其的维护绝对是一个噩梦。与此相反,我们可以让每种定制都有一个应用上下文,当应用加载时就去装载该上下文,这取决于登录的用户。更酷的是我们可以从ASP页面(需要从数据库中读取配置)中即时生成应用上下文。

InfoQ:Prana的长期计划是什么?

Herreman:最重要的事情就是IoC容器,我们期望1.0版会有一个稳定的容器。目前来看,容器本身很不错,但我们还可以改进一些东西,增加更多的Spring特性,如parent beans及自动装配等。我们还需要编写一些文档。

我们一直在与开发团队探讨将扩展(Cairngorm、PureMVC等)从主代码库中移除,然后将其作为独立的扩展库发布。这么做将有利于发布管理。

我还准备开发一个AOP(Aspect-Oriented Programming,面向方面的编程)框架,但遇到了一些麻烦,这些麻烦是由ActionScript 3的一些限制导致的。AOP背后的主要思想是基于动态代理机制创建新的对象类型,该对象会在运行时实现一些接口。问题在于这在ActionScript 3中是不可能的。我们已经在Adobe JIRA上发布了这个话题,如果有人愿意与我们分享一些见解的话我将感激不尽。该话题位于:http://bugs.adobe.com/jira/browse/ASC-3136

至于其他方面,我们还没有制订严格的路线图。当我们有新想法时就会引入一些新特性和进行一些改进,我们一直在倾听来自其他开发者的建议,同时还期待有更多的人能加入到我们的团队中。

查看英文原文:Prana Framework Helps on ActionScript 3 Application Development

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: