写点什么

Prana Framework 力推 ActionScript 3 应用开发

  • 2008-11-05
  • 本文字数:2817 字

    阅读完需:约 9 分钟

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

2008-11-05 15:59883
用户头像

发布了 88 篇内容, 共 263.1 次阅读, 收获喜欢 8 次。

关注

评论

发布
暂无评论
发现更多内容

模运算和与运算的一点儿简单思考

LSJ

位运算 二进制

大数据开发技术应该怎么学习入门才好

@零度

大数据

软件工程师年满 40 岁,下一步怎么走?|本周话题

InfoQ写作社区官方

生涯规划 个人成长 职业规划 话题讨论

打造基于 PostgreSQL/openGauss 的分布式数据库解决方案

SphereEx

数据库 开源 分布式数据库 ShardingSphere SphereEx

如何在 Flutter 中设置背景图像【Flutter专题15】

坚果

flutter 28天写作 签约计划第二季 12月日更

【Java】代码重构时,为什么禁止在方法内对对象类型的入参赋值

恒生LIGHT云社区

Java 代码规范 java代码规范

Go语言学习查缺补漏ing Day2

恒生LIGHT云社区

Go 编程语言

详解工作流框架Activiti的服务架构和组件

华为云开发者联盟

工作流 工作流引擎 BPM Activiti BPMN

Redis架构实战:高并发情况下并发扣减库存

编程江湖

java编程

CIO如何制定低代码/无代码战略

WorkPlus

清空数组的几个方式

编程江湖

大前端

火山引擎+焱融 YRCloudFile,驱动数据存储新增长

焱融科技

云计算 分布式 云原生 高性能 文件存储

同态加密实现数据隐私计算,能让你的小秘密更加秘密

华为云开发者联盟

数据 加密 同态加密 联邦计算 数据隐私计算

开始读 Go 源码了

AlwaysBeta

golang 源码 源码阅读 源码剖析 Go web

mPaaS 月度小报|魔方卡片(Cube)公测,十个卡片模板任意使用

蚂蚁集团移动开发平台 mPaaS

小程序 消息推送 移动开发 API网关 cube

【AI最前线】精准优质-资讯|分享|热议第42期

百度大脑

前端避坑指南丨辛辛苦苦开发的APP竟然被判定为简单网页打包?

YonBuilder低代码开发平台

大前端 APP开发 APICloud 跨端开发

滚雪球学Python系列,真能学会Python!

梦想橡皮擦

内容合集 签约计划第二季

HBase 和 Hive 的差别是什么,各自适用在什么场景中

编程江湖

大数据

什么是云计算?云计算特点是什么?

行云管家

云计算 公有云 混合云 云资源

青藤解密:72%客户容器规模>100个,[镜像安全]谁来保护?

青藤云安全

镜像安全

做一款互联网内容平台,到底要懂多少AI?

百度开发者中心

AI

架构实战营 模块七作业

felix

「架构实战营」

复杂场景,从OpenTSDB迁移到TDengine的最佳实践

TDengine

数据库 tdengine

面对行业难题,华为云邀请物联网全行业拿出“亮剑”精神

华为云开发者联盟

IoT 华为云 LiteOS HarmonyOS IoT边缘

MySQL「 Every derived table must have its own alias」1248 错误修复法

蒋川

数据库 MySQL 运维 MySQL 数据库

百度智能客服斩获 “金音奖—中国最佳客户联络中心技术与解决方案奖”

百度大脑

人工智能 智能客服

等保工作五大误区汇总,让你更懂等保!

行云管家

网络安全 等保 等级保护

模仿UP主,用Python实现一个弹幕控制的直播间!

Zhendong

Python

JVM中的对象及引用

Ayue、

技术专题合集

莫要寻找可能不存在的答案

FunTester

学习 解决方案 自学 FunTester 思路

Prana Framework力推ActionScript 3应用开发_Java_Moxie Zhang_InfoQ精选文章