文件翻譯 - ApplicationDomain Class @ Ticore's Blog :: Xuite日誌
  • Site Search
  • Google
    Web Ticore's Blog
  • 最新文章
  • Recent Comments
  • 2006-12-18 18:16 文件翻譯 - ApplicationDomain Class
    平均分數:0 顆星    投票人數:0
    我要評分:

    ActionScript 3.0 加入了類別定義域的管理功能
    可以做到執行期動態加載外部類別定義(RSL)、外部模組的加載卸載...等
    不像 AS 2 的 RSL 是定死的

    對於開發 application 來說,是不可或缺的功能之一
    這全靠 ApplocationDomain Class
    以下便是文件上的翻譯


    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.digest = ".";
    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);

     

    相關參考資料:

    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

     

    Ticore / Xuite日誌 / 回應(0) / 引用(0) / 好文轉寄
  • 回應