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
评论