`
whilew
  • 浏览: 22224 次
文章分类
社区版块
存档分类
最新评论

Parsley 框架简介

 
阅读更多

原文地址:http://blog.chinaunix.net/uid-122937-id-143055.html

配置和初始化 Parsley 框架通常包括以下步骤:

  • 第 1 步: 告诉 IOC 容器哪些类需要被它管理. 这可以使用 MXML, XML 文件或者 ActionScript 来做.这三种机制会在跟着下来的章节中说明.
  • 第 2 步:配置容器的服务,如:依赖注入或者每个单独类的消息 .这可以在第 1 步中你选择的配置机制中完成 (例如:使用 MXML 或者 XML 配置标签) 或者 - 通常情况下在类中使用 AS3 Metadata 标签.
  • 第 3 步: 初始化 IOC 容器(通常在程序开始时). 在 Parsley 2 中通常只需一行代码. 可以查看下面例子.

3.1 使用 AS3 Metadata 进行配置

AS3 Metadata 标签可以用来配置像依赖注入或者消息等服务. 它们可以放到由 Parsley管理的任何类中去.使用 metadata 标签的配置可以与 XML 或者 MXML 的配置相结合. 几乎每个 metadata 标签每有与它相对应的 MXML 和 XML 配置标签. 为了避免冲突, MXML 和 XML 配置会优于 Metadata 配置, 因此你可以覆盖 metadata 配置而不必对类的代码进行修改.

每个 metadata 标签和它们的属性会在相应的章节的相关例子中说明:

3.2 MXML 配置

这种配置只能被 Flex 程序使用. 其它的配置在 Flex 和 Flash 程序中都可用.

假定你要配置以下两个类:

      package com.bookstore.service {
          class LoginServiceImpl implements LoginService {
               public var timeout:int;
               public function login (username:String, password:String) : void {
                     // execute service    
               }
          }
     }
     package com.bookstore.actions {
         class LoginAction {
            [Inject]
            public var service:LoginService
    
            [MessageHandler]
            public function handleLoginEvent (event:LoginEvent) : void {
                service.login(event.username, event.password); 
            } 
         }
    }

你可以见到使用 metadata 已经配置了几个功能. 查看第4章依赖注入第5章消息系统了解这些功能的细节.

MXML 配置文件

我们需要告诉容器管理这些类并创建以下 MXML file:

    <mx:Object 
        xmlns:mx="http://www.adobe.com/2006/mxml"
        xmlns:services="com.bookstore.services.*"
        xmlns:actions="com.bookstore.actions.*">
    
        <services:LoginServiceImpl timeout="3000"/>
    
        <actions:LoginAction/>
    
    </mx:Object> 

请注意我们并不需要导入 Parsley . 只需要在 MXML 中添加普通的 object 标签. 除了 metadata 标签你还可以使用 MXML 标签进行其它配置 , 比如上面例子的 timeout 值.


框架的初始化

最后你需要初始化容器. 假设你将配置保存在 BookstoreConfig.mxml, 你可以使用以下命令将它初始化:

         FlexContextBuilder.build(BookStoreConfig);

在许多程序中,以上的一行代码便是你唯一直接使用的 Parsley API.你可以在某些类的方法上添加 [PostConstruct] 标签让程序开始时执行这些方法. 查看第6.5章Context 周期了解细节.

理论上你也可以使用 Parsley 的 API:

          var context:Context = FlexContextBuilder.build(BookStoreConfig);
          var initializer:BookStoreInitializer = context.getObjectByType(BookStoreInitializer) as BookStoreInitializer;
          initializer.execute();

但这种用法并不推荐使用. 在一般的程序中都无需直接使用 Parsley 的 API. 只有在 Parsley 基础创建你自己的框架时才使用.


使用 Parsleys MXML 标签

以上的 MXML 配置还可以使用 Parsley 标签来代替 object 标签:

<mx:Object 
    xmlns:mx="http://www.adobe.com/2006/mxml"
    xmlns="http://www.spicefactory.org/parsley">
    
    <mx:Script>
        <![CDATA[
            import com.bookstore.services.*;        
            import com.bookstore.actions.*;        
        ]]>
    </mx:Script>
    
    <Object type="{LoginServiceImpl}">
        <Property name="timeout" value="3000"/>
    </Object>
    
    <Object type="{LoginAction}"/>
    
</mx:Object> 

使用这些特殊的标签比普通的标签有其它的功能. 两种方式都有优缺点:

普通 MXML 标签的优点:

  • 简单、可直接使用.
  • 无需知道 Parsley 的配置标签.
  • 编译器会检查属性值的类型.

Parsley MXML 标签的优点:

  • 允许使用构造器注入 . 从封装性方面来看,这是依赖注入的最干净的方式. 使用普通标签时你不能使用构造器注入的方式,因为在那种情况下 MXML 编译器生成了对象的创建代码并且 Parsley 只能在对象实例化后才得到该对象. 当使用普通标签时,你的类需要一个没有参数的构造方法.
  • 允许定义对象为 lazy的 (<Object lazy="true" type="..."/>) ,也就是说在你第一次使用该对象之前它不会被初始化和配置.
  • 允许将一个对象配置成非单例的(<Object singleton="false" type="..."/>). 也就是说,每次从容器取这个对象或者将这个对象注入其它对象时,容器都会创建一个新的实例.
  • 允许使用自定义标签. Parsley 2 是非常容易扩展的. 你可以使用一个类来创建一个自定义的扩展,然后将它作为自定义的 metadata 标签, MXML 或者 XML. 你可以查看 第11章扩展本框架中的例子.

3.3 XML 配置文件

在以下情况中,外部 XML 文件是 MXML 之外的另一个合适的选择:

  • 你的配置经常发生改变而你又不想再进行编译.
  • 配置文件可以被不懂编程的人进行修改.
  • 你没有在使用 Flex.

当然你也可以在某部分配置中使用 XML 文件而仍然使用 MXML 配置来注入你的核心服务. 查看第3.5章将多个配置机制整合了解细节.

上面例子的 MXML 配置也可以配置成以下的 XML 配置:

<objects 
    xmlns="http://www.spicefactory.org/parsley"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.spicefactory.org/parsley 
        http://www.spicefactory.org/parsley/schema/2.0/parsley-core.xsd"
    >
    <object type="com.bookstore.services.LoginServiceImpl">
        <property name="timeout" value="3000"/>
    </object>
    
    <object type="com.bookstore.services.LoginServiceImpl"/>
</objects>

一般的 XML 配置跟使用 Parsley MXML 标签的 MXML 配置非常类似. 在底层它们实现的作用是一样的.唯一的不同是 XML 配置需要使用 XML 规范,标签不可以大写并且属性名需要使用-,如: targetProperty 要写成target-property .

假定你的配置文件是config.xml,初始化还是使用一行代码:

           XmlContextBuilder.build("config.xml");

编译在 XML 中配置的类

你需要注意的是:与在 MXML 中配置的类不同,XML 中配置的某些类如果没有被使用的话,它不会被编译到你的 SWC 或者 SWF 文件.

解决这个问题有三种方法(即:你想要把没有使用的类也要编译到 SWC 或者 SWF 文件):

  • 在你的代码中添加这些类的引用,即使你并不需要它.
  • 如果你想将这些类作为库使用, 将它们编译到一个 SWC (使用compc你可以将整个源代码文件夹包含到 SWC 文件) 然后使用mxmlc编译器中的-include-libraries选项将整个 SWC 包含到你的 SWF 文件.
  • 你可以使用mxmlc编译器的-includes选项来包含某些类.

3.4 ActionScript 配置

如果你只认识 Flex IOC 容器的话,你可能不熟悉这种方式. 它跟 Java 的 Spring 框架中的 JavaConfig 有点相似. 它允许你使用代码的方式来创建要给 Parsley 管理的对象. 我们使用之前例子的那两个类并将它们添加到 IOC 容器中:

package com.bookstore.config {

  class BookStoreConfig {

    public const action:LoginAction = new LoginAction();
    
    public function get service () : LoginServiceImpl {
        var service:LoginServiceImpl = new LoginServiceImpl();
        service.timeout = 3000;
        return service;    
    }

  }
}

我们使用了 ActionScript 来设置 timeout 属性. 无论你使用var,const或者一个 getter 函数来声明对象,这些对象都会被添加到 IOC 容器中.

初始化还是只用一行代码:

            ActionScriptContextBuilder.build(BookStoreConfig);

这个配置模式允许你增加 metadata 标签:

[ObjectDefinition(singleton="false")]
public function get service () : LoginServiceImpl {
    var service:LoginServiceImpl = new LoginServiceImpl();
    service.timeout = 3000;
    return service;    
}

在上面的例子中,每次这个对象被请求时,容器都会调用 getter 函数. 默认的 singleton 属性是true, 所以如果没有 metadata 标签的话 Parsley 只调用这个方法一次并把这个实例缓存起来,对于所有的注入都是重复使用同一个实例.

3.5 将多个配置机制整合

自Version2.2后,配置管理机制允许指定实例在运行期间,作为容器的一部分:

    <parsley:ContextBuilder>
         <parsley:FlexConfig type="{ServiceConfig}"/>
         <parsley:FlexConfig type="{ControllerConfig}"/>
         <parsley:XmlConfig file="logging.xml"/>
         <parsley:RuntimeConfig instances="{[instance1, instance2]}"/>
    </parsley:ContextBuilder>

如果你需要指定ID,也可标注子标签:

<parsley:ContextBuilder>
    <parsley:FlexConfig type="{ServiceConfig}"/>
    <parsley:FlexConfig type="{ControllerConfig}"/>
    <parsley:XmlConfig file="logging.xml"/>
    <parsley:RuntimeConfig>
        <parsley:Instance id="obj1" instance="{instance1}"/>    
        <parsley:Instance id="obj2" instance="{instance2}"/>    
        <parsley:Instance id="obj3" instance="{instance3}"/>    
    </parsley:RuntimeConfig>
</parsley:ContextBuilder>

在RuntimeConfig标签中添加的对象与之后添加的DynamicObjects不同之处在于,前面的作为根对象,可注入到其它对象中,因为它们在上下文构建时已指定。

你甚至可以使用普通的<Object>为内部标签

<parsley:ContextBuilder>
    <parsley:FlexConfig type="{ServiceConfig}"/>
    <parsley:FlexConfig type="{ControllerConfig}"/>
    <parsley:XmlConfig file="logging.xml"/>
    <parsley:RuntimeConfig>
        <parsley:Instance id="obj1" instance="{instance1}"/>    
        <parsley:Instance id="obj2" instance="{instance2}"/>    
        <parsley:Object id="obj3" type="{LoginInterceptor}"/> 
            <parsley:MessageInterceptor method="intercept" type="{LoginEvent}"/>
        </parsley:Object>    
    </parsley:RuntimeConfig>
</parsley:ContextBuilder>

你也可以用编码方式进行配置:

   var rcp:RuntimeConfigurationProcessor = new RuntimeConfigurationProcessor();
     rcp.addInstance(instance1, "id1");
      rcp.addInstance(instance2, "id2");
      rcp.addClass(MyClass, "id3");

      var builder:CompositeContextBuilder = new DefaultCompositeContextBuilder(viewRoot);
      FlexContextBuilder.merge(MainConfig, builder);
      builder.addProcessor(rcp);
      builder.build();

3.6 混合多个配置方式

虽然你可能在大多数程序中偏好于只用一个配置, 你不必一定要这样做. 你可以将本章所讲的配置进行组合使用.

对于一种配置,你也可以将它分成几个文件. 然后使用buildAll方法:

          FlexContextBuilder.buildAll([BookStoreServices, BookStoreActions]);
          XmlContextBuilder.buildAll(["services.xml", "actions.xml"]);
          ActionScriptContextBuilder.buildAll([BookStoreServices, BookStoreActions]);

你也可以使用CompositeContextBuilder类将它们合并在一起:

          var builder:CompositeContextBuilder = new CompositeContextBuilder();
          FlexContextBuilder.merge(BookStoreConfig, builder);
          XmlContextBuilder.merge("logging.xml", builder);
          builder.build();	

这种方式也是很简单的: 你只需创建一个CompisiteContextBuilder类的实例并把它放到各个context builder 类的merge方法中.

以上所有的例子最终的结果都是一个 Parsley Context. 无论你有多少个配置文件,结果都是一样的.

对于大型和复杂的程序,你想要创建模块化 Contexts, 即多个配置不是合并到一个 Context, 以便它们可以根据需要进行加载和缷载. 对于模块化的程序你可以阅读第8章使用 Flex Modules第6.4章Modular Contexts.

最后,如果你想要创建你自己的配置模式并将它与现有的配置方式无缝地结合的话, 你可以创建ObjectDefinitionBuilder接口的实例并将它们传入到CompositeContextBuilder.addBuilder. 查看第11章扩展本框架了解细节 .

分享到:
评论

相关推荐

    parsley loc框架 flash flex 通用

    标题中的“Parsley LOC框架”指的是Parsley框架,这是一个专门为Adobe Flex和ActionScript开发者设计的开源依赖注入(Dependency Injection)和应用架构框架。它增强了Flex和Flash应用程序的可维护性和可扩展性,...

    parsley框架(中文版)

    Parsley框架是一款专为Flex和Flash设计的IOC(Inversion of Control)容器和消息框架。它的主要目标是帮助开发者构建高度解耦的架构,通过Metadata、MXML、XML或ActionScript来配置和管理对象。Parsley的核心是IOC...

    ParsleyTest Flex框架parsley的使用入门

    这个名为"ParsleyTest"的压缩包文件包含了关于如何开始使用Parsley框架的源码示例,旨在提供比官方文档更为深入的实践教程。 首先,让我们理解一下什么是依赖注入和控制反转。依赖注入是一种设计模式,它允许我们将...

    flex parsley IOC框架笔记

    Parsley框架通过解耦组件,使得代码更加模块化,便于测试和重用。 在了解Flex Parsley之前,有必要先熟悉一些基本概念和技术,如: 1. **Flex MXML技术**:MXML是一种标记语言,用于创建Flex应用程序的用户界面,...

    parsley-flash api

    这个API允许开发者在Flash环境中与Parsley框架进行交互,提供更高级别的事件处理、依赖注入以及面向切面编程(AOP)的支持。 1. **Parsley框架**:Parsley是Guillaume Laforge开发的一个开源框架,主要用于Flex和...

    parsley例子parsley例子

    **Parsley框架详解** Parsley是SpringSource公司开发的一个强大的ActionScript 3和Flex应用程序的依赖注入(DI)框架。它为Flex和Flash开发者提供了面向对象编程和设计模式的支持,使得大型项目的管理和维护变得...

    parsley-2.3.1资源

    这个资源包包含了所有开发者需要的组件,以便于理解和利用Parsley框架进行高效开发。 首先,让我们来深入了解"Parsley"。Parsley 是一个面向对象的设计模式库,它基于Scalaz库,为Scala语言提供了一种强大的依赖...

    ActionScript Parsley 3 帮助文档

    Parsley框架的一个关键特征是它不依赖于Flex SDK核心,这意味着它既适用于纯粹的Flex应用,也适用于传统的Flash应用,并且可以与Flex深度集成。Parsley的核心组件包括IOC容器和消息子系统,它们可以独立于Flex SDK...

    parsley2.4英文开发手册

    **Parsley** 是一个为 **Flex 和 Flash 应用程序** 设计的应用框架,其核心构建在一个 **IoC 容器** 和 **消息传递框架** 基础之上,这些特性使得开发人员能够构建高度解耦的架构。该框架支持多种配置方式,包括 **...

    Parsley.js-

    **Parsley.js** 是一个强大的前端验证框架,专门用于JavaScript,它的主要目的是在用户提交表单之前确保输入数据的有效性和正确性。这个框架通过添加轻量级的DOM数据属性和事件来实现验证,无需编写复杂的JavaScript...

    parsley官方资料详解

    Parsley 是一个专门为 Flex 和 Flash 开发的 Inversion of Control (IOC) 容器和消息框架,旨在创建高度解耦的架构。它的核心功能包括依赖注入、对象生命周期管理和消息传递,且具备良好的扩展性。Parsley 不仅能在 ...

    Parsley Hello World 实例工程源代码

    Parsley Hello World 实例工程源代码是一个针对初学者设计的项目,旨在帮助开发者了解和掌握Parsley框架的基本用法。Parsley是Adobe Flex应用程序中的一个强大的依赖注入(DI)和事件管理框架,它使得组件之间的通信...

    Some technical documents of Parsley.

    在本文中,我们将深入探讨Parsley框架的核心概念、设计哲学以及如何通过一个简单的"Hello World"示例来快速上手。 Parsley框架的核心理念是提供一种灵活且可扩展的方式来组织和管理UI逻辑。它强调组件化和模块化,...

    Flex Cairngorm Parsley Demo 源码

    Flex Cairngorm和Parsley是两种在Adobe Flex框架中广泛使用的MVC(Model-View-Controller)设计模式实现库,它们主要用于构建大型、复杂的富互联网应用程序(RIA)。本源码Demo提供了这两种技术的集成应用实例,帮助...

    parsley2 中文指南

    若你不知道parsley,但您一定听过Cairngorm、Mate、PureMVC、Swiz或SpringAcitonScript,只要听说过其中之一就好了,因为parsley也是他们行列中的一员,是Adobe项目组今年7月份推荐的一个灵活的flex框架!

    parsley2.3中文文档

    - 了解如何初始化Parsley框架,使其准备就绪,处理应用的启动过程。 **配置与初始化** 8. **整合多个配置机制** - Parsley支持多种配置方式的组合,如XML、ActionScript和元数据,为开发者提供了极大的灵活性。 ...

    轻量级前端表单校验框架parsley的API+简单汉化parsley.min.js

    Parsley,是一款强大的JavaScript表单验证插件,可以帮助你只使用简单的配置即可实现表单验证功能,这完全基于它的强大DOM-API。 主要特性: 基于超棒的用户体验 超级方便配置 超轻量级(压缩后12K),支持...

Global site tag (gtag.js) - Google Analytics