Documentation Flash CS3 |
|||
| Programmation avec ActionScript 3.0 > Environnement du système client > Utilisation de la classe ApplicationDomain | |||
Le rôle de la classe ApplicationDomain est de stocker un tableau des définitions ActionScript 3.0. L'ensemble du code d'un fichier SWF est défini de sorte à exister dans un domaine d'application. Les domaines d'application vous servent à partitionner les classes qui se trouvent dans un même domaine de sécurité. Ainsi, plusieurs définitions de la même classe peuvent exister et les enfants peuvent réutiliser les définitions des parents.
Vous pouvez utiliser les domaines d'application lors du chargement, au moyen de la classe Loader, d'un fichier SWF externe écrit en ActionScript 3.0. (Notez que vous ne pouvez pas utiliser les domaines d'application lorsque vous chargez une image ou un fichier SWF écrit en ActionScript 1.0 ou ActionScript 2.0.) Toutes les définitions ActionScript 3.0 contenues dans la classe chargée sont stockées dans le domaine d'application. Lorsque vous chargez un fichier SWF, vous devez indiquer que le fichier doit être inclus dans le même domaine d'application que l'objet Loader en attribuant au paramètre applicationDomain de l'objet LoaderContext la valeur ApplicationDomain.currentDomain. Si vous placez le fichier SWF chargé dans le même domaine d'application, vous bénéficiez d'un accès direct à ses classes. Cela s'avère pratique si vous chargez un fichier SWF qui contient des médias incorporés auxquels vous pouvez accéder via les noms de classe associés, ou si vous voulez accéder aux méthodes du fichier SWF chargé, comme le montre l'exemple suivant :
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
}
}
}
Voici d'autres points à garder à l'esprit lorsque vous utilisez les domaines d'application :
Le schéma suivant figure une application qui charge du contenu à partir de divers fichiers SWF au sein d'un domaine unique, domain1.com. Selon le contenu chargé, différents domaines d'application peuvent être utilisés. Le texte suivant décrit la logique utilisée pour définir le domaine d'application approprié pour chaque fichier SWF de l'application.
Le fichier principal d'application est application1.swf. Il contient des objets Loader qui chargent du contenu à partir d'autres fichiers SWF. Dans ce scénario, le domaine en cours est Application domain 1. L'utilisation A, l'utilisation B et l'utilisation C illustrent les différentes techniques permettent de définir le domaine d'application approprié pour chaque fichier SWF de l'application.
Utilisation A : Partitionnez le fichier enfant SWF en créant un enfant du domaine du système. Dans le schéma, le domaine d'application 2 est créé comme enfant du domaine du système. Le fichier application2.swf est chargé dans le domaine d'application 2 et ses définitions de classe sont ainsi partitionnées à partir des classes définies dans application1.swf.
Cette technique s'appliquera par exemple lorsqu'une ancienne application doit charger dynamiquement une nouvelle version de la même application sans créer de conflits. Les conflits sont éliminés parce que même si les noms de classe sont les mêmes, ils sont répartis dans différents domaines d'application.
Le code suivant créé un domaine d'application qui constitue un enfant du domaine du système :
request.url = "application2.swf"; request.applicationDomain = new ApplicationDomain();
Utilisation B : Ajoutez de nouvelles définitions de classe aux définitions actuelles. Le domaine d'application module1.swf est défini sur le domaine actif (application domain 1). Vous pouvez alors ajouter au jeu actuel de définitions de classe de l'application de nouvelles définitions de classe. Cela pourrait servir pour une bibliothèque d'exécution partagée appartenant à l'application principale. Le fichier SWF est traité comme une bibliothèque partagée distante (RSL, remote shared library). Utilisez cette technique pour charger des RSL à l'aide d'un fichier de préchargement avant le lancement de l'application.
Le code suivant définit un domaine d'application au domaine actuel :
request.url = "module1.swf"; request.applicationDomain = ApplicationDomain.currentDomain;
Utilisation C : Utilisez les définitions de classe du parent en ajoutant un nouveau domaine enfant au domaine actif. Le domaine d'application de module3.swf est un enfant du domaine actuel, qui utilise pour toutes les classes les versions du parent. Cette technique peut s'appliquer à un module d'une application Internet riche (RIA, Rich Internet Application) à plusieurs écrans, qui serait chargé comme enfant de l'application principale et utiliserait les types de cette dernière. Si vous pouvez garantir que toutes les classes sont toujours mises à jour pour rester compatibles avec les anciennes versions et que l'application de chargement est toujours plus récente que les contenus qu'elle charge, les enfants utiliseront les versions des parents. L'utilisation d'un nouveau domaine d'application vous permet de décharger toutes les définitions de classe en vue du nettoyage, à condition de veiller à ce qu'il ne subsiste aucune référence au fichier SWF enfant.
Cette technique autorise les modules chargés à partager les objets Singleton et les membres de classe statiques de l'objet Loader.
Le code suivant crée un nouveau domaine enfant du domaine actif :
request.url = "module3.swf"; request.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);
Flash CS3
M'envoyer un message électronique lorsque des commentaires sont ajoutés à cette page | Rapport de commentaire
Page en cours: http://livedocs.adobe.com/flash/9.0_fr/main/00000327.html