Trabajo con dominios de aplicación

Flash Player 9 y posterior, Adobe AIR 1.0 y posterior

El propósito de la clase ApplicationDomain es almacenar una tabla de definiciones de ActionScript 3.0. Todo el código de un archivo SWF se define como existente en un dominio de aplicación. Los dominios de aplicación se utilizan para hacer particiones de clases en el mismo dominio de seguridad. Esto permite que coexistan varias definiciones de la misma clase y que los elementos secundarios puedan reutilizar definiciones de elementos principales.

Se pueden utilizar dominios de aplicación al cargar un archivo SWF externo programado en ActionScript 3.0 mediante la API de la clase Loader. (Hay que tener en cuenta que no se pueden utilizar dominios de aplicación al cargar una imagen o un archivo SWF programado en ActionScript 1.0 o ActionScript 2.0.) Todas las definiciones de ActionScript 3.0 contenidas en la clase cargada se almacenan en el dominio de aplicación. Al cargar el archivo SWF, se puede especificar que se incluya el archivo en el mismo dominio de aplicación que el del objeto Loader, estableciendo el parámetro applicationDomain del objeto LoaderContext en ApplicationDomain.currentDomain . Al colocar el archivo SWF cargado en el mismo dominio de aplicación, se puede acceder a sus clases directamente. Esto puede resultar útil si se carga un archivo SWF que contiene medios incorporados, a los que se puede acceder a través de sus nombres de clases asociados, o si se desea acceder métodos del archivo SWF cargado.

En el siguiente ejemplo se supone que se tiene acceso a un archivo Greeter.swf independiente que define un método público denominado 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 
        } 
    } 
}

Consulte también el ejemplo de la clase ApplicationDomain en Referencia de ActionScript 3.0 para la plataforma de Adobe Flash .

Otras cosas que hay que tener en cuenta al trabajar con dominios de aplicación son las siguientes:

  • Todo el código de un archivo SWF se define como existente en un dominio de aplicación. El dominio actual es el lugar en el que se ejecuta la aplicación principal. El dominio del sistema contiene todos los dominios de la aplicación, incluido el dominio actual, lo que significa que contiene todas las clases de Flash Player.

  • Todos los dominios de aplicación tienen asociado un dominio principal, excepto el dominio del sistema. El dominio principal del dominio de aplicación principal es el dominio del sistema. Solo es necesario definir las clases cargadas si su clase principal no las ha definido todavía. No es posible anular una definición de clase cargada con otra definición más reciente.

En el diagrama siguiente se muestra una aplicación que carga contenido de diversos archivos SWF de un solo dominio, domain1.com. En función del contenido que se cargue, se pueden utilizar distintos dominios de aplicación. El texto siguiente describe la lógica que se utiliza para establecer el dominio de aplicación apropiado para cada archivo SWF de la aplicación.

Ver gráfico a tamaño completo
A.
Uso A

B.
Uso B

C.
Uso C

El archivo de aplicación principal es application1.swf. Contiene objetos Loader que cargan contenido de otros archivos SWF. En este escenario, el dominio actual es Application domain 1. Los usos A, B y C ilustran distintas técnicas para establecer el dominio de aplicación apropiado para cada archivo SWF de una aplicación.

Uso A
Dividir el archivo SWF secundario creando un elemento secundario del dominio del sistema. En el diagrama, el dominio de aplicación 2 se crea como un elemento secundario del dominio del sistema. El archivo application2.swf se carga en el dominio de aplicación 2 y sus definiciones de clase se dividen de las clases definidas en application1.swf.

Una aplicación de esta técnica es hacer que una aplicación antigua cargue dinámicamente una versión más reciente de la misma aplicación sin conflictos. No hay conflictos porque, aunque se usen los mismos nombres de clase, se dividen en distintos dominios de aplicación.

El código siguiente crea un dominio de aplicación que es un elemento secundario del dominio del sistema y comienza a cargar un archivo SWF que utiliza ese dominio de aplicación:

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

Uso B:
Añadir nuevas definiciones de clase a las definiciones de clase actuales. El dominio de aplicación de module1.swf se establece en el dominio actual (dominio de aplicación 1). Esto permite añadir nuevas definiciones de clase al conjunto actual de definiciones de clase de la aplicación. Esto se puede utilizar para una biblioteca compartida en tiempo de ejecución de la aplicación principal. El archivo SWF cargado se trata como una biblioteca remota compartida (RSL). Esta técnica se utiliza para cargar bibliotecas RSL mediante un precargador antes de que se inicie la aplicación.

El código siguiente carga un archivo SWF, estableciendo su dominio de aplicación en el dominio actual:

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

Uso C:
Utilizar las definiciones de clase del elemento principal creando un nuevo dominio secundario del dominio actual. El dominio de aplicación de module3.swf es un elemento secundario del dominio actual y el elemento secundario utiliza las versiones del elemento principal de todas las clases. Una aplicación de esta técnica podría ser un módulo de una aplicación de Internet compleja de varias pantallas, cargada como un elemento secundario de la aplicación principal y que utiliza los tipos de la aplicación principal. Si hay la seguridad de que siempre se actualizarán todas las clases para ser compatibles con versiones anteriores y que la aplicación de carga es siempre más reciente que los elementos que carga, los elementos secundarios utilizarán las versiones del elemento principal. Tener un nuevo dominio de aplicación también permite descargar todas las definiciones de clase para eliminar datos innecesarios, si hay la seguridad de que no siguen existiendo referencias al archivo SWF secundario.

Esta técnica permite que los módulos cargados compartan los objetos singleton del cargador y los miembros de clase estáticos.

El código siguiente crea un nuevo dominio secundario del dominio actual y comienza a cargar un archivo SWF que utiliza ese dominio de aplicación:

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