楼主: jieforest

常用Flex IOC框架比较分析

[复制链接]
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
21#
 楼主| 发表于 2009-9-30 23:58 | 只看该作者
总结

经过其他一些框架的不断启发,新版本的Parsley已发展成为一个完整的IOC框架。它还支持模块式开发和上下文卸载。在模块化Flex应用开发日益盛行的今天,这无疑是一个十分重要的特性。

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
22#
 楼主| 发表于 2009-9-30 23:58 | 只看该作者
Flicc
框架:Flicc
网站:http://flicc.sourceforge.net/
开发者:Mike Herron
版本:0.5
许可:开源
配置:MXML

在IOC领域,Flicc是一个不太知名的后来者。它的配置方法(利用MXML文件)略有不同。它在MXML中有自己的对象定义标记,借此可将预先存在的对象传入工厂,并添加依赖(如传入一个视图)。

在MXML中声明依赖的好处,是依赖在编译时就被包含到应用中,这样可避免在应用运行时由于依赖的丢失造成异常。当然其缺点也是明显的,即不重新编译程序,依赖就不能改变。

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
23#
 楼主| 发表于 2009-9-30 23:58 | 只看该作者
对象工厂和对象配置

在Filcc中,将Configure标签添加到视图后,可以传入要配置的实例。另外也可以传入已经存在的实例并进行配置——和我在Spring ActionScript实现中使用过的Inject标签类似。
基本配置
创建一个从MXMLObjectFactory继承的配置类。
创建一个Filcc实例并传入配置。
在需要的地方,将Configure标签添加到你的视图中。
<FliccListener>
<MxmlObjectFactory>
<Config/>
</MxmlObjectFactory>
</FliccListener>

MxmlObjectFactory标签被添加到应用的根部。MxmlObjectFactory上一层的FliccListener标签,表示要求Flicc拣选出由Configure标签派发的应用程序显示列表中的事件。Config.mxml是我的配置文件。

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
24#
 楼主| 发表于 2009-9-30 23:58 | 只看该作者
设置控制器

和Parsley类似,Filcc支持在配置文件中将事件和对象绑定,尽管它并不使用控制器这个概念。

我利用这种方法将控制器绑定到事件源(即LoginPM)。当LoginPM派发它的事件时,事件被控制器截获,随后调用对应的处理器。
<Object objectId="controller" clazz="{ SimpleController }">
<handlers>
<EventHandler eventName="{ LoginEvent.LOGIN }" handler="handleEvent">
<source>
<Ref to="loginPM"/>
</source>
</EventHandler>
</handlers>

<handlerArray>
<List clazz="{ Array }">
<Ref to="loginHandler"/>
</List>
</handlerArray>
</Object>

我们在控制器中查找给定类型的事件,并触发execute方法:
public function handleEvent( event : Event ) : void
{
getHandlerForEventType( event.type ).execute( event );
}

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
25#
 楼主| 发表于 2009-9-30 23:58 | 只看该作者
表现层模型的注入

同样,在这个例子中,我删除了表现层模型间的继承结构。Filcc也支持setter或constructor这两种注入方法。

Filcc有两类基本的对象标签:Component和Object。Component用于描述你想配置的、已经存在的对象。Object则用于创建新实例。例如:
<Object objectId="dashboardPM" clazz="{ DashboardPM }">
<constructor>
<Ref to="user"/>
</constructor>
</Object>

和Spring ActionScript、Parsley类似,你应按对象期望的顺序声明对象构造函数的参数。Ref表示引用声明在同一个上下文中的其他对象,该对象的标识用to属性表示。

Component和Object类似,但仅能依靠setter注入,因为Component描述的是已经存在并被传入Flicc的对象:
<Component objectId="main">
<controller>
<Ref to="controller"/>
</controller>
<pm>
<Ref to="mainPM"/>
</pm>
</Component>

如上的Component表示主应用,具有两个依赖:一个控制器、一个pm变量。

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
26#
 楼主| 发表于 2009-9-30 23:59 | 只看该作者
配置服务层

LoginHandler依赖于LoginDelegate,后者又依赖于RemoteObject。

配置如下:
<Object objectId="loginDelegate" clazz="{ LoginDelegate }">
<remoteObject>
<Ref to="remoteObject"/>
</remoteObject>
</Object>

<Object objectId="remoteObject" clazz="{ RemoteObject }">
<destination>
FLICC_DESTINATION
</destination>
</Object>

上述代码声明了一个新的LoginDelegate实例,并填充了它对RemoteObject的依赖。

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
27#
 楼主| 发表于 2009-9-30 23:59 | 只看该作者
总结

Flicc不同于前面讨论过的两个框架,它的声明方式为MXML。当然这只是一个形式,所有框架的基本原理都是相同的。

在MXML中定义配置,可节省开发时间,因为类被编译进应用,运行时就不必花时间处理外部文件的载入和解析。因其API和先前两个框架有所不同,要熟练运用可能得花点时间。

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
28#
 楼主| 发表于 2009-9-30 23:59 | 只看该作者
Swiz

说明:本文中使用的Swiz不是最新,因此在这里讨论的使用方法可能不适用于新的版本。建议在开发前访问Swiz框架的网站,查阅最新文档。同时,我也正在Swiz最新版基础上,更新本文的这部分内容。
框架:Swiz
网站:http://code.google.com/p/swizframework/
开发者:Chris Scott
版本:0.0.5
许可:开源
配置:MXML + Metadata

Swiz也是一个新兴的IOC框架,但不仅限于此。它旨在发展成为一个完整的RIA(Rich Internet Application)架构下的解决方案。Swiz利用MXML定义对象,但有着不同的注入机制。

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
29#
 楼主| 发表于 2009-9-30 23:59 | 只看该作者
核心概念

Swiz也有一个加载进Swiz实例的配置文件。此配置文件使用标准的MXML声明格式,其利弊共存。好处是类被自动加载为类路径的一个部分,可以利用数据绑定实现对象依赖的注入。其缺点是用MXML声明对象时,不能创建构造函数中带参数的对象。当然你可以在ActionScript块中完成相关初始化工作,但就因此失去了完全依靠声明标记所体现出的表达质量了。

Swiz会根据注入的定义,从类中读取元数据,并由此判定要在何地注入何种对象。是Google Guice让这种方法在Java用户中流行起来的。

有了元数据,你的对象包含的信息更为丰富,你的配置文件也更清晰。
基本配置
将元数据参数添加到编译器
创建Bean文件
将元数据添加到你想注入依赖的类中

在Swiz中,你可在应用程序的根部加载Bean集合:
private function onPreInitialize() : void
{
Swiz.getInstance().loadBeans( [ AppBeans ] );
}

获得具体的Bean,在Swiz中就有两种方法了:
Swiz.getBean( "loginHandler" )

或使用元数据:
[Autowire(bean="dashboardPM")]
public var pm : DashboardPM

有关其他可能的方法,请参看Swiz文档。但若使用元数据注入,需记住的是,类必须包含在显示列表中,否则注入无效。上述代码来自于 DashboardPanel。

在底层,Swiz会监听被添加到显示列表的全部对象,并通过反射判断这些对象是否包含注入元数据。为读取元数据,这些对象必须被序列化为XML,因此存在性能问题。

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
30#
 楼主| 发表于 2009-10-1 00:00 | 只看该作者
设置控制器

Swiz在指定通过Swiz内部机制派发的事件的处理函数方面做得很好。

我在LoginHandler中增加如下元数据:
[Mediate(event="LOGIN", properties="username,password")]
public function login( username : String, password : String ) : void

然后在事件源(LoginPM)如按如下派发事件:
Swiz.dispatchEvent( new LoginEvent( username, password ) );

至此,将事件源挂接到处理函数需做的全部工作都完成了。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表