Werken met toepassingsdomeinen

Flash Player 9 of hoger, Adobe AIR 1.0 of hoger

Het doel van de klasse ApplicationDomain is het opslaan van een tabel met ActionScript 3.0-definities. Alle code in een SWF-bestand wordt zo gedefinieerd dat deze geschikt is voor een toepassingsdomein. Toepassingsdomeinen worden gebruikt om klassen in te delen die deel uitmaken van hetzelfde beveiligingsdomein. Zo kunnen meerdere definities van dezelfde klasse bestaan en kunnen onderliggende toepassingen de definities van bovenliggende toepassingen hergebruiken.

U kunt toepassingsdomeinen gebruiken wanneer u een extern SWF-bestand dat is geschreven in ActionScript 3.0 laadt met de API van de klasse Loader. (Overigens kunt u geen toepassingsdomeinen gebruiken wanneer u afbeeldingen of SWF-bestanden laadt die zijn geschreven in ActionScript 1.0 of ActionScript 2.0.) Alle ActionScript 3.0-definities die zich in de geladen klasse bevinden, worden opgeslagen in het toepassingsdomein. Wanneer u het SWF-bestand laadt, kunt u opgeven dat het bestand moet worden opgenomen in hetzelfde toepassingsdomein als dat van het object Loader, door de parameter applicationDomain van het object LoaderContext in te stellen op ApplicationDomain.currentDomain. Als u het geladen SWF-bestand in hetzelfde toepassingsdomein plaatst, hebt u direct toegang tot de klassen van het bestand. Dit kan handig zijn als u een SWF-bestand laadt dat ingesloten media bevat, die u kunt benaderen via de bijbehorende klassennamen, of u als u toegang wilt hebben tot de methoden van het geladen SWF-bestand.

In het volgende voorbeeld wordt ervan uitgegaan dat er toegang is tot een afzonderlijk Greeter.swf-bestand waarmee een openbare methode wordt gedefinieerd met de naam welcome():

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 
        } 
    } 
}

Zie ook het voorbeeld van de ApplicationDomain-klasse in de Naslaggids voor ActionScript 3.0 voor het Adobe Flash-platform.

Wanneer u met toepassingsdomeinen werkt, moet u rekening houden met het volgende:

  • Alle code in een SWF-bestand wordt zo gedefinieerd dat deze geschikt is voor een toepassingsdomein. Het huidige domein is het domein waarin uw hoofdtoepassing wordt uitgevoerd. Het systeemdomein bevat alle toepassingsdomeinen, inclusief het huidige domein. Dit betekent dat het alle Flash Player-klassen bevat.

  • Aan alle toepassingsdomeinen, met uitzondering van het systeemdomein, is een bovenliggend domein gekoppeld. Het bovenliggende domein van het toepassingsdomein van de hoofdtoepassing is het systeemdomein. Geladen klassen worden alleen gedefinieerd wanneer dit niet wordt gedaan door het bovenliggende domein. U kunt een definitie van een geladen klasse niet overschrijven met een nieuwe definitie.

Het volgende diagram toont een toepassing die inhoud laadt van verschillende SWF-bestanden in één domein, domain1.com. Afhankelijk van de inhoud die u laadt, kunnen verschillende toepassingsdomeinen worden gebruikt. De onderstaande tekst beschrijft de logica die wordt gebruikt om het juiste toepassingsdomein in te stellen voor elk SWF-bestand in de toepassing.

Afbeelding op volledige grootte weergeven
A.
Gebruik A:

B.
Gebruik B

C.
Gebruik C

Het hoofdtoepassingsbestand is application1.swf. Het bevat objecten Loader die inhoud laden van andere SWF-bestanden. In dit scenario is het huidige domein toepassingsdomein 1. Gebruik A, B en C tonen verschillende technieken voor het instellen van het juiste toepassingsdomein voor elk SWF-bestand in een toepassing.

Gebruik A:
het onderliggende SWF-bestand afscheiden door een onderliggend domein van het systeemdomein te maken. In het diagram wordt toepassingsdomein 2 gemaakt als een onderliggend domein van het systeemdomen. Het bestand application2.swf wordt geladen in toepassingsdomein 2, zodat de klassendefinities worden afgescheiden van de klassen die zijn gedefinieerd in application1.swf.

U kunt deze techniek bijvoorbeeld gebruiken om een oude toepassing een nieuwe versie van dezelfde toepassing te laten laden zonder dat er een conflict optreedt. Hoewel dezelfde klassennamen worden gebruikt, ontstaat er geen conflict omdat deze worden ondergebracht in verschillende toepassingsdomeinen.

Met de volgende code wordt een toepassingsdomein gemaakt dat een onderliggend domein van het systeemdomein is. Vervolgens wordt met dat toepassingsdomein een SWF geladen.

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

Gebruik B:
nieuwe klassendefinities toevoegen aan de huidige klassendefinities. Het toepassingsdomein van module1.swf wordt ingesteld op het huidige domein (toepassingsdomein 1). U kunt nu nieuwe klassendefinities toevoegen aan de huidige set klassendefinities van de toepassing. U kunt dit bijvoorbeeld doen voor een gezamenlijke bibliotheek bij uitvoering van de hoofdtoepassing. De geladen SWF wordt behandeld als een externe gezamenlijke bibliotheek (RSL). U kunt deze techniek gebruiken om RSL's te laden via een voorlader voordat de toepassing wordt gestart.

Met de volgende code wordt een SWF geladen, waarbij het toepassingsdomein wordt ingesteld op het huidige domein:

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

Gebruik C:
de klassendefinities van de bovenliggende toepassing gebruiken door een nieuw onderliggend domein aan te maken van het huidige domein. Het toepassingsdomein van module3.swf is een onderliggend domein van het huidige domein en de onderliggende toepassing gebruikt de versies van de bovenliggende toepassing van alle klassen. U kunt deze techniek bijvoorbeeld gebruiken om een module van een RIA (Rich Internet Application) met meerdere schermen te laden als een onderliggende toepassing van de hoofdtoepassing, die de typen van de hoofdtoepassing gebruikt. Als u ervoor kunt zorgen dat alle klassen altijd achterwaarts compatibel blijven als ze worden bijgewerkt, en dat de ladende toepassing altijd nieuwer is dan wat er wordt geladen, gebruiken de onderliggende toepassingen altijd de versies van de bovenliggende toepassingen. Met een nieuw toepassingsdomein kunt u bovendien alle klassendefinities verwijderen, zolang u er maar voor zorgt dat u alle referenties naar de onderliggende SWF ook verwijdert.

Met deze techniek kunnen geladen modules de objecten Singleton en statische klassenleden delen.

Met de volgende code wordt een nieuw onderliggend domein van het huidige domein gemaakt. Vervolgens wordt met dat toepassingsdomein een SWF geladen.

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);