Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3252426
  • 博文数量: 530
  • 博客积分: 13360
  • 博客等级: 上将
  • 技术积分: 5473
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-13 13:32
文章分类

全部博文(530)

文章存档

2017年(1)

2015年(2)

2013年(24)

2012年(20)

2011年(97)

2010年(240)

2009年(117)

2008年(12)

2007年(8)

2006年(9)

分类:

2010-04-29 15:05:52

本章简单介绍如何使用 Parsley 创建程序,你可以查看其它章节了解详细。大多数的描述都适用于开发 Flex 或者 Flash 程序. 只适用于 Flex开发的例子会作特别说明.

2.1 Hello world应用程序举例

    如果你想一边读手册,一边看例子,你可以查看Hello World例子。

   本章不涉及例子应用程序,以下可能会在更多的例子上加入变化的功能。

2.2 添加框架的 SWC 文件

使用 Parsley 之前你需要将它的 SWC 文件添加到你的库路径中.你可以根据你的 Flex 或者 Flash 程序的需要添加相应的 SWC 文件.

最快的方式是将包含整个框架的 SWC 添加到库路径. 你可以从下载的 Zip 文件的 release 文件夹找到.

Flex 程序需要的 SWC

  • parsley-complete-flex-${version}.swc
  • spicelib-complete-flex-${version}.swc

Flash 程序需要的 SWC

  • parsley-complete-flash-${version}.swc
  • spicelib-complete-flash-${version}.swc

选择单独的框架 SWC

如果你只想选择你正在使用的框架模块, 你可以选择release文件夹下的 modules文件夹中的相应的 SWC 文件 . 你需要注意每个 SWC 文件的依赖特性, 在 会有详细说明.

2.3 定义对象的依赖

这是 Parsley 最常用的功能. 在 Parsley 2 中我们可以非常方便地使用 Metadata 或者 MXML 或者 XML 文件来定义依赖.

使用 [Inject] metadata 标签

你可以在属性上使用标签:

        [Inject]
public var loginService:LoginService;
        [Inject]
public function set loginService (service:LoginService) : void {

或者你可以在方法上一次性声明多个依赖:

        [Inject]
public function init (loginService:LoginService, cartService:CartService = null) : void {

    以上例子的好处是, Parsley 会根据参数类型进行反射并对可选的参数进行可选地依赖注入. 在本例子中如果容器中没有LoginService 的话会抛出一个错误, 但没有CartService的话则不会.

    最后,你可以在类定义上使用相似的标签([InjectConstructor])来进行构造器注入 (因为 Flex 编译器会忽略构造器上 metadata 标签,所以要把它放在类定义上):

        [InjectConstructor]
public class LoginAction {

function LoginAction (loginService:LoginService, cartService:CartService = null) : void {

最佳实践

    在本章展示的所有的例子中,依赖会根据类型进行注入, 因为 Parsley 会根据属性和方法参数的类型进行反射. 要想从一个 IOC 容器中得到解耦的好处,你应该偏向于在注入点处使用接口类型进行声明. 这样,你可以在修改不同的实现时不用更改注入点.

    当然这只有在你往容器中只添加一个匹配类型的对象时有效. 如果你的同一个接口有多个实现,你需要使用 id (只有在属性上可用)进行注入:

        [Inject(id="mainLoginService")]
public var loginService:LoginService;

    你可以根据自己的需要选择属性、方法或者构造器注入. 有人会偏好于构造器注入,因为它有更好的封装性, 允许你创建持久类. 但 Flex 中的构造器注入也有一些局限性, 特别是如果你使用 MXML 配置来装配对象, 查看 了解细节.

2.4 发送和接收消息

    你在注入点使用接口类型的依赖注入的方式提供了一定的解耦,如果你想用更松的解耦,你可以使用消息进行通信,而发送者和接收者无需知道对方.

    如果你使用 MVC 架构来创建你的应用程序, 你可能创建一个 Mediator 类来将底层的视图事件转换成消息,而该消息会通过程序中的消息子系统发送出去,然后所有动作、控制器可以注册所有它们关注的消息类型.

    查看 和 .了解细节.

    使用 Parsley 2 你可以使用 metadat 标签来配置发送方和接收方. 发送方可能只需在类声明处使用一个 [ManagedEvents]标签列出这个类发送出的哪些事件需要被托管:

        [Event(name="loginSuccess",type="com.bookstore.events.LoginEvent")]
        [Event(name="loginFailed",type="com.bookstore.events.LoginEvent")]
        [Event(name="stateChange",type="flash.events.Event")]
        [ManagedEvents("loginSuccess,loginFailure")]

        public class LoginServiceImpl extends EventDispatcher implements LoginService {

        [...]

        private function handleLoginResult (user:User) : void {
        dispatchEvent(new LoginEvent("loginSuccess", user));
        }

        }

    这里我们告诉容器一旦这个类发送一个 loginSuccess 类型或者 loginFailed 类型的事件,容器都会把它发送到所有注册该事件的消息处理器. 而其它的事件将会被忽略, 这个类依然可以发送底层的事件到注册了对应事件的直接依赖于该类的对象.

    对于接收方,你可以使用[MessageHandler] 标签来通知关注某个类型的消息:

        [MessageHandler]
public function login (event:LoginEvent) : void {

    如果你在同一个事件类中有几个不同的消息,你可以用事件类型进行区分:

        [MessageHandler(selector="loginSuccess)]
public function login (event:LoginEvent) : void {

    依赖是根据类型注入的,这确保了系统的安全性,你也无需处理整个系统中事件类型的常量唯一性问题.关于接收方还有 [MessageBinding] 或者 [MessageInterceptor]等标签. 这会在 进行介绍.

    另外,因为这个模块叫做消息系统而不是事件系统, 你可以使用任何类作为一个消息, 不单单是那些继承 flash.events.Event的类. 查看 .

2.5 装配对象

    依赖注入和消息系统还有许多的配置标签. 但以上的是最常用的。现在我们要教你如何为 IOC 容器装配对象. 在你在类上面添加 metadata 标签后,你需要告诉容器:它需要管理哪些对象.

Flex Applications

    在 Flex 中你可能偏好于使用 MXML 配置. 你可以创建一个简单的 MXML 类 (使用 mx:Object 作为根标签) 并添加你要 Parsley 进行管理的类:

    xmlns:mx=""
xmlns:services="com.bookstore.services.*"
xmlns:actions="com.bookstore.actions.*">








    当然你也可以使用这个配置文件来设置其它属性值. 容器会处理所有类中的 metadata 标签的同时也会对它们进行处理.

    本例子中我们没有指定任何 id 属性. 如果你是使用根据类型注入的你就不必需要 id. 如果你在注入点使用 id 注入的话,你可以像下面那样指定:

        

然后你可以在注入点使用那些 id:

        [Inject(id="adminLogin")]
public var adminLogin:LoginService;

[Inject(id="userLogin")]
public var userLogin:LoginService;

    但一般情况下你应该尽量不要用 id 注入,只有在同一个类型有多个实例的情况下才用.

Flash Applications

    在这种情况下 MXML 并不可用. 所以最好使用 XML 文件进行配置.如果你不想把配置编译到你的程序中去的话你也可以使用外部 XML 文件

    与上面的 MXML 例子对应的 XML 配置如下所示:

    xmlns=""
xmlns:xsi=""
xsi:schemaLocation="
/schema/2.0/parsley-core.xsd"
>















    像 MXML 例子那样,我们无需指定对象的 id.如果需要的话,你也可以指定 .

    以上就是装配对象最常用的选项. 你可以在 找到更多例子.

2.6 初始化框架

    现在你可以使用 metadata 标签配置你的类,然后将它们装配到MXML 或者 XML 文件, 是时候初始化所有东西了,大多数情况下只需使用一行命令.

    设我们使用一个叫 BeanConfig.mxml进行配置, 那一行命令会如下所示:

           FlexContextBuilder.build(BeanConfig);

    就是这么简单,你应该尽早执行该命令, 一般是在主程序的 preinitialize 事件执行.

            preinitialize="FlexContextBuilder.build(BeanConfig)"
        addedToStage="dispatchEvent(new Event('configureIOC', true));"
        xmlns:s="library://ns.adobe.com/flex/spark"
        xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">

   注:

    如果你想将 MXML 定义的视图注入到容器的话,这是非常重要的。正如 所描述的那样.

    使用 XML 文件的话则使用以下命令:

            XmlContextBuilder.build("config.xml");

    我们会在此讨论所常用的用例. 在同一个程序中我们可能使用多个文件进行配置,也可能同时使用 MXML 和 XML 进行配置. 这些内容会在 讨论.

    对于模块化的程序你不会把所有的东西都整合到一块然后在程序开始时就把它们全部加载进来.对于创建模块化程序和根据需要进行加载、缷载配置的内容,请查看 和 .

2.7 增加更多的 Services

    由于这是刚开始学习阶段,我们只提及常用的用例. 希望可以使你开始编写简单的程序. 如果你需要更多知识,你应该阅读跟着的章节.

    如果你想了解 Parsley 提供的功能,你最好从 开始.

最有趣而本章没有提到的部分可能是:

  • : 你并不局限于使用 Metadata, MXML 或者 XML 进行配置,第四个选择是 ActionScript,它给予你另外的扩展性.
  • : 该章讨论了 MessageHandlers 另外的选择,使你可以干涉消息发送的处理过程 (例如:暂挂、恢复和取消消息的处理 ).
  • : 你可以往 IOC 容器中添加创建对象的工厂类来取代装配对象, 这为你如何将对象实例化提供了伸展性
  • : 异步地初始化对象的配置选项(例如:在对象可以被操作时先加载其它数据). 这种情况下,容器会推迟其它对象的初始化而先初始化那些被设置成异步的对象.
  • : 我们已经简单地提了一下这方面. 这令你可以将在 MXML 中定义的组件注入到 IOC 容器中声明的对象中去r.
  • : 关联配置的 services, actions, mediators。使用 Flex Module 可以在自动地加载和清除单独的模块.
  • (资源文件的绑定):将被管理对象的属性与资源文件绑定, 当资源文件发生改变时自动更新相应的属性.
  • : 你可以添加你自己的 Metadata, MXML 或者 XML 配置标签. 在简化配置任务或者在 Parsley 基础上创建你自己的框架时非常有用.
阅读(2389) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~