Flex 2 Live Docs - ApplicatonDomain Class
ApplicationDomain 类别的目的是用来保存 ActionScript 3.0 类别定义,swf 文件内所有的程序码都定义在一个既存的 application domain 内。你可以使用 application domain 分隔在同一个 security domain 下的类别,这样可以允许一个既存类别具有多重定义也可以让子程序重复使用父程序的定义。
当你用 ActionScript 3.0 Loader 类别 API 读取一个外部的 SWF 文件时可以使用 application domains (当读取一个图片或是 ActionScrip 1.0、2.0 SWF 文件时无法使用 application domain) 。当读取 SWF 文件时,你可以藉由设置 LoaderContext.applicationDomain 使该文件被包含进入与 Loader 对象相同的 application domain,将 SWF 文件放入相同的 application domain 之后,你便可以直接访问它的类别。
这是很有用处的,假如当你读取一个包含媒体的 SWF 文件,你可以透过关联的类别名称访问,或者你想要访问 SWF 文件的方法,如下所示:
package {
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.*;
import flash.net.URLRequest;
import flash.system.ApplicationDomain;
import flash.system.LoaderContext;
public class ApplicationDomainExample extends Sprite {
private var ldr:Loader;
public function ApplicationDomainExample() {
ldr = new Loader();
var req:URLRequest = new URLRequest("Greeter.swf");
var ldrContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
ldr.load(req, ldrContext);
}
private function completeHandler(event:Event):void {
ApplicationDomain.currentDomain.getDefinition("Greeter");
var myGreeter:Greeter = Greeter(event.target.content);
var message:String = myGreeter.welcome("Tommy");
trace(message); // Hello, Tommy
}
}
}
当你使用 application domain 时需要记住的事情:
- 在一个 SWF 文件内所有的程序存在一个 application domain。current domain 是你主要程序运行位置。system domain 包含所有的 application domain,包含 current domain,这意味它包含所有的 Flash Player 类别。
- 所有的 application domain,除了 system domain,都有一个关联的 parent domain。你的主要程序的 application domain 的 parent domain 便是 system domain。已读取完的类别只有在父程序没有该定义时才可以被定义,你不能用一个新的定义覆写一个已读取的类别定义。
以下的图片表示一个应用程序从几个不同的 SWF 文件读取到一个单独的 domain, domain1.com。依据读取的内容,使用不同的 application domain。
主应用程序是 application1.swf,包含 Loader 对象,从其它 SWF 文件读取内容。current domain 是 Application domain 1。使用方式 A、B、C 表示不同的技巧用来对每个 SWF 文件设置适当的 aplication domain。
使用方式 A:藉由创建一个 system domain 的子域分隔子 SWF 文件。
在此图,application domain 2 是由 system domain 创建的子域。 application2.swf 被读取进入 application domain 2,并且它的类别定义因此与 application1.swf 的类别分隔开来。
这技巧的使用方式之一便是一个旧的应用程序动态读取一个新的相同应用程序而不会发生冲突。虽然类别名称相同但是不会冲突,因为它们被不同的 application domain 分隔。
以下的程序创建一个 system domain 的子 application domain:
request.url = "application2.swf";
request.applicationDomain = new ApplicationDomain();
使用方式 B :添加新的类别定义到当前的类别定义中。
module1.swf 的 application domain 被设置为 current domain (application domain 1) ,这让你在当前的应用程序的类别定义中添加一个新的类别定义,可以用于主程序的运行期共享库,被读取的 SWF 被当作一个远程共享库 (RSL)。使用此技巧可以在应用程序开始前用 preloader 读取 RSLs。
以下的程序设置一个 application domain 到 current domain:
request.url = "module1.swf";
request.applicationDomain = ApplicationDomain.currentDomain;
使用方式 C : 藉由创建一个 current domain 的子域使用父类别的定义。
module3.swf 的 application domain 是 current domain 的子域,而子程序使用父程序的版本。这种技巧的使用方式之一可以是成为多重视窗 RIA 的模块,被读取作为主程序的子程序,而子程序使用主程序的型别。假如你可以确认所有的类别更新总是向下兼容,并且读取程序总是比被读取的新,子程序将会使用父程序的版本。假如后续没有任何的参考指向子 SWF,拥有一个新的 application domain 也可以让你移除所有的类别定义,是为垃圾收集。
以下的程序创建一个 current domain 的子 application domain:
request.url = "module3.swf";
request.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);
PS. 实际上 AS3 URLRequest 并没有 applicationDomain 属性
真正用来指定 ApplicationDomain 还是需要透过 LoaderContext
文档上的应该只是 Pseudo Code~
相关参考资料:
Roger Gonzalez - ApplicationDomain
Roger Gonzalez - Modular Applications (part 1)
Roger Gonzalez - Modular Applications (part 2)
Roger Gonzalez - Multi-SWF Applications
Claus Wahlers - w3blog - AS3 Loading Class Libraries at Runtime
Jesse Warden dot Kizz-om - Modular ActionScript Development
WDDJ - Working with Large Applications