首页 parsley中文版

parsley中文版

举报
开通vip

parsley中文版parsley学习指南1-概述 1.概述 Parsley 是一个为 Flex 和 Flash 设计的 IOC 容器和消息框架,使用它可以创建高解耦的构架,它允许你用Metadata, MXML, XML 或者 ActionScript 来配置 object,而这些 object 由一个容器来管理,而且 Parsley 是非常容易扩展的. 许多其它 Flash 平台的框架,有的是纯 Flex 框架而不能在没有 Flex SDK 时使用,有的就是不能与 Flex 深度集成的 Flash 框架,而Parsley 两者的功...

parsley中文版
parsley学习指南1-概述 1.概述 Parsley 是一个为 Flex 和 Flash 设计的 IOC 容器和消息框架,使用它可以创建高解耦的构架,它允许你用Metadata, MXML, XML 或者 ActionScript 来配置 object,而这些 object 由一个容器来管理,而且 Parsley 是非常容易扩展的. 许多其它 Flash 平台的框架,有的是纯 Flex 框架而不能在没有 Flex SDK 时使用,有的就是不能与 Flex 深度集成的 Flash 框架,而Parsley 两者的功能都具有. 本框架的核心 ( IOC 容器与消息子系统) 并不依赖于 Flex SDK , 但有一些额外的模块是专为 Flex 设计的, 为 MXML 配置、视力注入和 Flex模块提供了支持. 1.1 特性列 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 本部分提及了开发手册中其它章节的概要. 此外第2章 开始学习也包括了一些用例. IOC 容器 Parsley 是一个优秀的 IOC 容器. 它提供了依赖注入、对象生命周期的管理和消息的支持. 它与其它框架最主要的不同是框架的作用域: 它像其它小型的 IOC 框架一样为简单程序提供了易用性,而且也为大型、复杂和模块化的程序提供了许多特性,如:支持 Flex 模块、对象清理和大量的扩展点. 依 赖注入 这是任何 IOC 容器的核心功能. 现在 Parsley 2 的依赖注入功能可以非常方便地使用 AS3 Metadata 标签 ([Inject])(或者MXML、XML) 来对属性、 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 或者构造函数进行声明. 查看第4章 依赖注入了解详细. 消息 Parsley 包含一个消息框架允许对象以完全解耦的方式发送和接收消息. 你可以在发送对象上使用[ManagedEvents]标签来声明事件, 这样可以通过Parsley传递给注册该事件的处理器. 接收对象可以使用几种 metadata 标签如:[MessageHandler]来声明对特定消息类型的关注. 消息的传递是基于消息的类型(class)的,此外还可以增加消息的选择器如:事件的类型, 而不是像传统的事件处理器只基于纯字符串.这样你无需关心事件类型的常量在整个系统中是否唯一的问题. 查看第5章 消息了解细节. 高级 IOC 容器特性 6.5 内容 财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容 生命周期: 对象使用[PostConstruct]标记的方法 会在对象实例化和配置后调用,而带有[PreDestroy]标记的方法会在容器销毁后调用. 对于模块化的程序,你需要创建动态的加载子内容,而当它不再被使用时则可以清除整个模块. 6.2 异步对象的初始化: 异步初始化对象时的可选配置 (例如:在使用对象前需要加载数据). 容器会在配置成异步的对象准备好后才初始化其它对象. Flex 视图的注入 这是特别为Flex设计的整合模块并解决了你不想在 IOC 容器配置文件中声明 Flex 组件的问题, 就像平常一样在 MXML 视图中添加组件. Parsley 2 允许当组件添加到 Stage 后就交给 IOC 容器来处理. 查看第7章 Flex 组件的注入了解细节. 对 Flex 模块的支持 作为 Flex 的特别整合的模块,它可以关联到在特定内容需要的配置类、Flex 模块文件、services, actions, mediators 等等.当 Flex 模块被缷载时,与该模块相关的整个子系统、对象也会被销毁. 查看第8章 使用 Flex Modules了解详细. 本地化 使用 [ResourceBinding]标签将属性与资源文件绑定. 对于 Flex 程序,整合到 Flex ResourceManager,对于 Flash 程序也有相关的本地化模块. 查看第10章 本地化了解详细. 扩展性 Parsley 可以作为创建更高级框架的基础. 你也可以根据你的需要为你的程序添加一些配置标签进行相应的开发. Parsley 是很容易进行扩展的. 一个接口的实现就可以用来创建自定义配置标签,如: Metadata, MXML 或者 XML 标签. 查看第11章 扩展本框架和第6.1章 使用工厂类了解细节. 1.2 Parsley 和 Spicelib 模块的 SWC 文件Parsley 和底层的 Spicelib 是非常模块化的, 你只需选择你需要的 SWC 文件. 下载后的release文件夹包含了 Parsley 和 Spicelib 的 SWC 文件以及它们对应的 Flex 和 Flash 版本. module文件夹包含了实现不同子功能的 SWC 文件,你可以根据你需要添加到你的库路径中去. 使用子功能的 SWC 文件时,你需要注意每个 SWC 文件的依赖特性. 以下的图表展示了不同 SWC 之间的依赖特性. 名字省略了版本号和后缀名. 为了图表的清晰略去了几个可选的依赖文件 以下的表格 总结 初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf 了每个 SWC 的内容: spicelib-core 核 心 utilities, errors 和 events. spicelib-reflect Spicelib Reflection API. 查看 第16章 Reflection了解细节. spicelib-xml XML-to-Object 映射器. 查看 第17章 XML 到 Object 的映射器了解细节. spicelib-task 异 步操作的Task 框架. 查看 第18章 Task 框架了解细节. spicelib-flash Flash 日志框架. 查看 第19章 Flash 程序的日志了解细节. parsley-core 核 心 IOC 容器 - 依赖注入,消息, Metadata 或者 ActionScript 配置. parsley-flex Flex 整合特性:第3.2章 MXML 配置,第7章 Flex 组件注入,第8章 使用 Flex 模块. parsley-xml 提 供 XML 文件进行配置的支持 . 查看 第3.3章 XML 配置文件了解细节. parsley-flash Flash 整合特性: 第10.3章 本地化 Flash 程序,第13.2章 Flash 的日志配置. parsley-pimento 为 Pimento 和 Cinnamon 配置标签. 查看 第12.2章 Pimento Data Services和 第12.3章 Cinnamon Remoting. 2.入门 本章简单介绍如何使用 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 文件的依赖特性, 在 第 1.2章 Parsley 和 Spicelib Module 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 配置来装配对象, 查看 第 四章4 依赖注入 了解细节. 2.4 发送和接收消息 你在注入点使用接口类型的依赖注入的方式提供了一定的解耦,如果你想用更松的解耦,你可以使用消息进行通信,而发送者和接收者无需知道对方. 如果你使用 MVC 架构来创建你的应用程序, 你可能创建一个 Mediator 类来将底层的视图事件转换成消息,而该消息会通过程序中的消息子系统发送出去,然后所有动作、控制器可以注册所有它们关注的消息类型. 查看 5 Messaging 和 9 Building MVC Architectures.了解细节. 使用 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]等标签. 这会在 5 Messaging进 行介绍. 另外,因为这个模块叫做消息系统而不是事件系统, 你可以使用任何类作为一个消息, 不单单是那些继承 flash.events.Event的类. 查看 5.4 Injected MessageDispatchers. 2.5 装配对象 依赖注入和消息系统还有许多的配置标签. 但以上的是最常用的。现在我们要教你如何为 IOC 容器装配对象. 在你在类上面添加 metadata 标签后,你需要告诉容器:它需要管理哪些对象. Flex Applications 在 Flex 中你可能偏好于使用 MXML 配置. 你可以创建一个简单的 MXML 类 (使用 mx:Object 作为根标签) 并添加你要 Parsley 进行管理的类: 当然你也可以使用这个配置文件来设置其它属性值. 容器会处理所有类中的 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 配置如下所示: 像 MXML 例子那样,我们无需指定对象的 id.如果需要的话,你也可以指定 . 以上就是装配对象最常用的选项. 你可以在 3 Configuration and Initialization找到更多例子. 2.6 初始化框架 现在你可以使用 metadata 标签配置你的类,然后将它们装配到MXML 或者 XML 文件, 是时候初始化所有东西了,大多数情况下只需使用一行命令. 设我们使用一个叫 BeanConfig.mxml进行配置, 那一行命令会如下所示: FlexContextBuilder.build(BeanConfig); 就是这么简单,你应该尽早执行该命令, 一般是在主程序的 preinitialize 事件执行. 注: 如果你想将 MXML 定义的视图注入到容器的话,这是非常重要的。正如 第 7章 Flex 组件的注入所描述的那样. 使用 XML 文件的话则使用以下命令: XmlContextBuilder.build("config.xml"); 我们会在此讨论所常用的用例. 在同一个程序中我们可能使用多个文件进行配置,也可能同时使用 MXML 和 XML 进行配置. 这些内容会在 第 3.5章 整合多个配置文件讨论. 对于模块化的程序你不会把所有的东西都整合到一块然后在程序开始时就把它们全部加载进来.对于创建模块化程序和根据需要进行加载、缷载配置的内容,请查看 第 6.4章 Modular Contexts 和 第 8章 使用 Flex Modules. 2.7 增加更多的 Services 由于这是刚开始学习阶段,我们只提及常用的用例. 希望可以使你开始编写简单的程序. 如果你需要更多知识,你应该阅读跟着的章节. 如果你想了解 Parsley 提供的功能,你最好从 第 1.1章 特性列表开始. 最有趣而本章没有提到的部分可能是: ​ 3.4 ActionScript 配置: 你并不局限于使用 Metadata, MXML 或者 XML 进行配置,第四个选择是 ActionScript,它给予你另外的扩展性. ​ 5.7 MessageInterceptors(消 息拦截器): 该章讨论了 MessageHandlers 另外的选择,使你可以干涉消息发送的处理过程 (例如:暂挂、恢复和取消消息的处理 ). ​ 6.1 使 用 Factories 类: 你可以往 IOC 容器中添加创建对象的工厂类来取代装配对象, 这为你如何将对象实例化提供了伸展性 ​ 6.2 异 步对象的初始化: 异步地初始化对象的配置选项(例如:在对象可以被操作时先加载其它数据). 这种情况下,容器会推迟其它对象的初始化而先初始化那些被设置成异步的对象. ​ 7 Flex 组件的注入: 我们已经简单地提了一下这方面. 这令你可以将在 MXML 中定义的组件注入到 IOC 容器中声明的对象中去r. ​ 8 使 用 Flex Modules: 关联配置的 services, actions, mediators。使用 Flex Module 可以在自动地加载和清除单独的模块. ​ 10.1 ResourceBindings(资 源文件的绑定):将被管理对象的属性与资源文件绑定, 当资源文件发生改变时自动更新相应的属性. ​ 11.2 创 建自定义的配置标签: 你可以添加你自己的 Metadata, MXML 或者 XML 配置标签. 在简化配置任务或者在 Parsley 基础上创建你自己的框架时非常有用. 3.配置与初始化 配置和初始化 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 标签和它们的属性会在相应的章节的相关例子中说明: ​ 4 依 赖注入 ​ 5 消 息系统 ​ 6.1 使 用 Factories类 ​ 6.2 异 步对象的初始化 ​ 6.5 Context 生命周期 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: 请注意我们并不需要导入 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 标签: 使用这些特殊的标签比普通的标签有其它的功能. 两种方式都有优缺点: 普通 MXML 标签的优点: ​ 简单、可直接使用. ​ 无需知道 Parsley 的配置标签. ​ 编译器会检查属性值的类型. Parsley MXML 标签的优点: ​ 允许使用构造器注入 . 从封装性方面来看,这是依赖注入的最干净的方式. 使用普通标签时你不能使用构造器注入的方式,因为在那种情况下 MXML 编译器生成了对象的创建代码并且 Parsley 只能在对象实例化后才得到该对象. 当使用普通标签时,你的类需要一个没有参数的构造方法. ​ 允许定义对象为 lazy的 () ,也就是说在你第一次使用该对象之前它不会被初始化和配置. ​ 允许将一个对象配置成非单例的(). 也就是说,每次从容器取这个对象或者将这个对象注入其它对象时,容器都会创建一个新的实例. ​ 允许使用自定义标签. Parsley 2 是非常容易扩展的. 你可以使用一个类来创建一个自定义的扩展,然后将它作为自定义的 metadata 标签, MXML 或者 XML. 你可以查看 第11 章 扩展本框架中的例子. 3.3 XML 配置文件 在以下情况中,外部 XML 文件是 MXML 之外的另一个合适的选择: ​ 你的配置经常发生改变而你又不想再进行编译. ​ 配置文件可以被不懂编程的人进行修改. ​ 你没有在使用 Flex. 当然你也可以在某部分配置中使用 XML 文件而仍然使用 MXML 配置来注入你的核心服务. 查看 第 3.5章 将多个配置机制整合 了解细节. 上面例子的 MXML 配置也可以配置成以下的 XML 配置: 一般的 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后,配置管理机制允许指定实例在运行期间,作为容器的一部分: 如果你需要指定ID,也可标注子标签: 在RuntimeConfig标签中添加的对象与之后添加的DynamicObjects不同之处在于,前面的作为根对象,可注入到其它对象中,因为它们 在上下文构建时已指定。 你甚至可以使用普通的为内部标签 你也可以用编码方式进行配置: 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章 扩展本框架 了解细节 . 4.依赖注入 定义你的类的依赖是配置你程序的服务与动作的其中一个核心任务. 本章会介绍 Parsley 提供给你进行依赖注入的各种选项. 依赖注入的一般方式是使用 AS3 Metadata 标签方式. 因为一个类的依赖是该类的定义的一个重要方面,所以在 ActionScript 类本身进行依赖的定义最好不过. 在某些情况下你可能偏好于使用外部的依赖声明, 相关的选项会在本章的最后部分 4.5 在 MXML 或者 XML中声明依赖进行讨论. 4.1 构造器方式的注入 许多人会认为这是从封装方面来说最干净的注入, 因为它让你创建了不能改变的类. 由于 Flash Player 目前会忽略放在构造方法上的 metadata 标签,你需要将 [InjectConstructor] 标签放到类的声明上面来告诉 Parsley 产生构造器方式的注入: package com.bookstore.actions { [InjectConstructor] class LoginAction { private var service:LoginService; private var manager:UserManager; function LoginAction (service:LoginService, manager:UserManager = null) { this.service = service; this.manager = manager; } } } 需要注意以上的例子中的 manager 参数是可选的. Parsley 会根据这个信息进行反射并决定依赖是必需的还是可选的. 所以在本例子中如果容器中没有LoginService 的话会抛出一个错误, 但没有CartService的话则不会.. 构造器注入是基于参数类型进行注入. 这意味着容器中对于某个类型最多会包含一个对象. 你最好习惯于使用接口作为参数的类型,这样在改变接口的实现时就无需修改类的代码. 正如 第 3.2章 MXML 配置 所讲的,如果你想用构造器注入的话你不可以使用简单 MXML 标签来配置,因为该情况下 MXML 编译器会生成对象的创建代码并且 Parsley 只会在对象实例化后才能得到它. 所以不应该像下面那样定义一个类: 你应该像下面那样来定义: 在使用 Parsley 的 Object 标签时,对象是由容器来初始化的,这样构造器注入才可以实现. 使用 XML 配置时没有什么限制. 但 Flash Player 有个讨厌的 bug,就是在构造函数参数类型进行反射时使用的 describeType 并不能正确地工作 (这种情况下 Flash Player 总是把类型认为 '*' ). 解决这个 bug 的一个方法是在 Parsley 初始化前创建这些类的实例: new LoginAction(); new ShoppingCartAction(); You can simply throw away these instances, just creating an instance "fixes" describe type for the parameter types of that class. 4.2 方法注入 方法注入与构造器注入相似. 你可以将 [Inject] metadata 标签放到任何方法上: package com.bookstore.actions { class LoginAction { private var service:LoginService; private var manager:UserManager; [Inject] public function init (service:LoginService, manager:UserManager = null) : void { this.service = service; this.manager = manager; } } } 与构造器注入一样, Parsley 会知道方法的参数是可选的还是必需的并相应地将注入设定成可选的或必需的. 注入的对象会根据类型来选择,所以你需要确保你的配置中每种类型最多有一个对象. 方法注入的 MXML 配置并没有限制, 相比于构造器注入你只需使用简单 MXML 标签来往容器添加对象. 4.3 根据类型的属性注入 这种注入与方法注入相似, 用于属性的注入: package com.bookstore.actions { class LoginAction { private var manager:UserManager; [Inject] public var service:LoginService; [Inject(required="false")] public function set manager (manager:UserManager) : void { this.manager = manager; } } } 你可以将 [Inject] 标签放到一个 var 声明或者一个 setter 方法上. 对于属性, Parsley 不能检测出该注入是必需的还是可选的,所以你要显性地设置它的 required 属性. 如果忽略该属性的话默认值是 true. 像构造器注入和方法注入一样,这种注入也是根据类型注入的. 所以你需要确保你的配置中每种类型最多有一个对象. 4.4 根据 ID 的属性注入 如果你不想容器根据类型来注入,你可以显性地设置需要注入对象的 id 属性: [Inject(id="defaultLoginService")] public var service:LoginService; 这种情况下 Parsley 会根据 id 来注入,所以配置文件也需要包含一个对应的 id: 一般不推荐这种使用 id 的注入.最好使用根据类型来注入. 如果你需
本文档为【parsley中文版】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_802385
暂无简介~
格式:doc
大小:567KB
软件:Word
页数:75
分类:互联网
上传时间:2011-05-22
浏览量:21