Verwenden von Anwendungsdomänen

Flash Player 9 und höher, Adobe AIR 1.0 und höher

Mit der ApplicationDomain-Klasse kann eine Tabelle mit ActionScript 3.0-Definitionen gespeichert werden. Der gesamte Code in einer SWF-Datei ist so definiert, dass er sich in einer Anwendungsdomäne befindet. Mit Anwendungsdomänen werden Klassen unterteilt, die sich in der gleichen Sicherheitsdomäne befinden. Dies ermöglicht mehrere Definitionen der gleichen Klasse und die Wiederverwendung übergeordneter Definitionen in untergeordneten Klassen.

Sie können Anwendungsdomänen beim Laden einer externen SWF-Datei, die in ActionScript 3.0 programmiert ist, über API-Funktionen der Loader-Klasse laden. (Beachten Sie, dass Anwendungsdomänen beim Laden von Bildern oder in ActionScript 1.0 oder ActionScript 2.0 programmierten SWF-Dateien nicht verwendet werden können.) Alle ActionScript 3.0-Definitionen in der geladenen Klasse werden in der Anwendungsdomäne gespeichert. Beim Laden einer SWF-Datei können Sie angeben, dass die Datei in der gleichen Anwendungsdomäne wie das Loader-Objekt gespeichert wird. Setzen Sie dazu den applicationDomain -Parameter des LoaderContext-Objekts auf ApplicationDomain.currentDomain . Durch Einfügen der geladenen SWF-Datei in die gleiche Anwendungsdomäne können Sie direkt auf die zugehörigen Klassen zugreifen. Dies kann nützlich sein, wenn die geladene SWF-Datei eingebettete Medien enthält, auf die Sie über die zugeordneten Klassennamen zugreifen können, oder wenn Sie auf die Methoden der geladenen SWF-Datei zugreifen möchten.

Das folgende Beispiel geht davon aus, dass Zugriff auf eine separate Greeter.swf-Datei besteht, welche eine öffentliche Methode mit dem Namen welcome() definiert:

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 
        { 
            var myGreeter:Class = ApplicationDomain.currentDomain.getDefinition("Greeter") as Class; 
            var myGreeter:Greeter = Greeter(event.target.content); 
            var message:String = myGreeter.welcome("Tommy"); 
            trace(message); // Hello, Tommy 
        } 
    } 
}

Weitere Informationen finden Sie auch im Beispiel zur ApplicationDomain-Klasse im ActionScript 3.0-Referenzhandbuch für die Adobe Flash-Plattform .

Beachten Sie beim Verwenden von Anwendungsdomänen die folgenden Punkte:

  • Der gesamte Code in einer SWF-Datei ist so definiert, dass er sich in einer Anwendungsdomäne befindet. Die aktuelle Domäne ist die Domäne, in der die Hauptanwendung ausgeführt wird. Die Systemdomäne enthält alle Anwendungsdomänen, einschließlich der aktuellen Domäne, d. h. alle Klassen von Flash Player.

  • Mit Ausnahme der Systemdomäne sind alle Anwendungsdomänen mit einer übergeordneten Domäne verknüpft. Die Systemdomäne ist die übergeordnete Domäne der Anwendungsdomäne der Hauptanwendung. Geladene Klassen werden nur definiert, wenn sie in der jeweils übergeordneten Klasse nicht bereits definiert sind. Die Definition einer geladenen Klasse kann nicht mit einer neueren Definition überschrieben werden.

In der folgenden Abbildung ist eine Anwendung dargestellt, in der Inhalte aus verschiedenen SWF-Dateien in einer einzelnen Domäne, „domain1.com“, geladen werden. Je nach geladenen Inhalten können unterschiedliche Anwendungsdomänen verwendet werden. Im folgenden Text wird der Code beschrieben, der zum Festlegen der entsprechenden Anwendungsdomäne für jede SWF-Datei in der Anwendung verwendet wird.

Grafik in Originalgröße anzeigen
A.
Verwendung A

B.
Verwendung B

C.
Verwendung C

Die Datei „application1.swf“ ist die Datei der Hauptanwendung. Sie enthält Loader-Objekte, über die Inhalte aus anderen SWF-Dateien geladen werden. In diesem Szenario ist die Anwendungsdomäne 1 die aktuelle Domäne. Verwendung A, Verwendung B und Verwendung C sind verschiedene Verfahren zum Festlegen der geeigneten Anwendungsdomäne für alle SWF-Dateien einer Anwendung.

Verwendung A
Unterteilung der untergeordneten SWF-Datei durch Erstellen einer untergeordneten Domäne der Systemdomäne. In der Abbildung wird Anwendungsdomäne 2 als untergeordnete Domäne der Systemdomäne erstellt. Die Datei „application2.swf“ wird in Anwendungsdomäne 2 geladen, die entsprechenden Klassendefinitionen sind daher von den in der Datei „application1.swf“ definierten Klassen getrennt.

Eine Verwendungsmöglichkeit dieses Verfahrens besteht darin, dass in einer älteren Anwendung dynamisch eine neuere Version der gleichen Anwendung ohne Konflikte geladen werden kann. Obwohl die gleichen Klassennamen verwendet werden, treten keine Konflikte auf, da die Klassen in verschiedene Anwendungsdomänen unterteilt werden.

Mit dem folgenden Code wird eine Anwendungsdomäne erstellt, die der Systemdomäne untergeordnet ist, und das Laden einer SWF-Datei gestartet, die diese Anwendungsdomäne verwendet:

var appDomainA:ApplicationDomain = new ApplicationDomain(); 
 
var contextA:LoaderContext = new LoaderContext(false, appDomainA); 
var loaderA:Loader = new Loader(); 
loaderA.load(new URLRequest("application2.swf"), contextA);

Verwendung B:
Hinzufügen neuer Klassendefinitionen zu aktuellen Klassendefinitionen. Als Anwendungsdomäne von „module1.swf“ ist die aktuelle Domäne (Anwendungsdomäne 1) festgelegt. Dadurch können Sie neue Klassendefinitionen zu den aktuellen Klassendefinitionen der Anwendung hinzufügen. Dies kann bei einer gemeinsam genutzten Laufzeitbibliothek der Hauptanwendung eingesetzt werden. Die geladene SWF-Datei wird als gemeinsam genutzte Remote-Bibliothek (RSL, Remote Shared Library) behandelt. Mit diesem Verfahren können Sie gemeinsam genutzte Remote-Bibliotheken mit einem Preloader laden, bevor die Anwendung startet.

Mit dem folgenden Code wird eine SWF-Datei geladen, wobei die Anwendungsdomäne auf die aktuelle Domäne festgelegt wird:

var appDomainB:ApplicationDomain = ApplicationDomain.currentDomain; 
 
var contextB:LoaderContext = new LoaderContext(false, appDomainB); 
var loaderB:Loader = new Loader(); 
loaderB.load(new URLRequest("module1.swf"), contextB);

Verwendung C:
Erstellen einer neuen untergeordneten Domäne der aktuellen Domäne mithilfe der Klassendefinitionen der übergeordneten Domäne. Die Anwendungsdomäne von „module3.swf“ ist eine untergeordnete Domäne der aktuellen Domäne. In der untergeordneten Domäne werden alle Klassen der übergeordneten Domäne verwendet. Dieses Verfahren kann beispielsweise für ein Modul einer Rich Internet Application (RIA) für mehrere Bildschirme verwendet werden, die als untergeordnete Domäne der Hauptanwendung geladen wird und bei der die Typen der Hauptanwendung verwendet werden. Wenn Sie sicherstellen, dass alle Klassen immer so aktualisiert werden, dass sie abwärts kompatibel sind, und wenn die Anwendung immer aktueller ist als die geladenen Objekte, werden in den untergeordneten Domänen die übergeordneten Klassenversionen verwendet. Durch die Verwendung einer neuen Anwendungsdomäne können darüber hinaus alle Klassendefinitionen bei der automatischen Speicherbereinigung (Garbage Collection) entfernt werden, wenn Sie sicherstellen, dass keine Verweise auf die untergeordnete SWF-Datei vorhanden sind.

Bei diesem Verfahren können geladene Module die Singleton-Objekte des Loaders und die statischen Klassenmitglieder gemeinsam verwenden.

Mit dem folgenden Code wird eine neue untergeordnete Domäne der aktuellen Domäne erstellt und eine SWF-Datei geladen, die diese Anwendungsdomäne verwendet:

var appDomainC:ApplicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain); 
 
var contextC:LoaderContext = new LoaderContext(false, appDomainC); 
var loaderC:Loader = new Loader(); 
loaderC.load(new URLRequest("module3.swf"), contextC);