Praca z domenami aplikacji

Flash Player 9 i nowsze wersje, Adobe AIR 1.0 i nowsze wersje

Klasa ApplicationDomain służy do przechowywania tabeli definicji elementów kodu ActionScript 3.0. Całość kodu zawartego w pliku SWF jest zdefiniowana i istnieje w domenie aplikacji. Domeny aplikacji służą do rozdzielania klas, które należą do tej samej domeny zabezpieczeń. Dzięki temu może istnieć wiele definicji tej samej klasy, a klasy potomne mogą korzystać z definicji macierzystych.

Z domen aplikacji można korzystać w przypadku ładowania zewnętrznego pliku SWF napisanego w języku ActionScript 3.0 za pomocą interfejsu API klasy Loader. (Nie jest możliwe korzystanie z domen aplikacji w przypadku ładowania obrazu lub pliku SWF napisanego w języku ActionScript 1.0 lub ActionScript 2.0). Wszystkie definicje z kodu ActionScript 3.0 zawarte w ładowanej klasie są przechowywane w domenie aplikacji. Ładując plik SWF, można określić, że plik powinien należeć do tej samej domeny aplikacji, co obiekt Loader. W tym celu należy ustawić parametr applicationDomain obiektu LoaderContext na wartość ApplicationDomain.currentDomain . Umieszczenie wczytanego pliku SWF w tej samej domenie aplikacji umożliwia bezpośrednie uzyskiwanie dostępu do jego klas. Takie rozwiązanie bywa użyteczne, jeśli ładujemy plik SWF zawierający multimedia osadzone, dostępne za pośrednictwem powiązanych z nimi nazw klas, lub jeśli chcemy korzystać z metod załadowanego pliku SWF.

W poniższym przykładzie założono, że dostępny jest odrębny plik Greeter.swf, w którym zdefiniowana jest metoda publiczna o nazwie 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 
        } 
    } 
}

Zobacz także przykład użycia klasy ApplicationDomain w Skorowidzu języka ActionScript 3.0 dla platformy Adobe Flash .

Oto dodatkowe uwarunkowania, o których należy pamiętać podczas pracy z domenami aplikacji:

  • Całość kodu zawartego w pliku SWF jest zdefiniowana i istnieje w domenie aplikacji. Domena bieżące to domena, w której działa główna aplikacja. Domena systemowa zawiera wszystkie domeny aplikacji, w tym domenę bieżącą, co oznacza że zawiera wszystkie klasy programu Flash Player.

  • Wszystkie domeny aplikacji, z wyjątkiem domeny systemu, posiadają skojarzoną domenę nadrzędną. Domeną nadrzędną domeny głównej aplikacji jest domena systemowa. Załadowane klasy są definiowane tylko wtedy, gdy nie zostały one już zdefiniowane przez obiekt drugorzędny. Nie jest możliwe nadpisanie definicji załadowanej klasy przy pomocy nowszej definicji.

Na poniższym schemacie przedstawiono aplikację, która ładuje treść z różnych plików SWF w jednej domenie, domain1.com. W zależności od rodzaju ładowanej treści można używać różnych domen aplikacji. Poniżej opisano logikę wyboru domeny aplikacji dla poszczególnych plików SWF należących do aplikacji.

Powiększ obraz
A.
Użycie A

B.
Użycie B

C.
Użycie C

Główny plik aplikacji to application1.swf. Zawiera on obiekty Loader, które ładują treści z innych plików SWF. W tym scenariuszu domena domyślna do Domena aplikacji 1. Użycie A, użycie B i użycie C ilustrują różne techniki wyboru odpowiedniej domeny aplikacji dla każdego pliku SWF w aplikacji.

Użycie A
Oddzielamy podrzędny plik SWF, tworząc domenę podrzędną względem systemowej. Na schemacie Domena aplikacji 2 jest tworzona jako podrzędna względem domeny systemowej. Plik application2.swf jest ładowany do Domeny aplikacji 2, a jego definicje klas są zatem oddzielone od klas zdefiniowanych w pliku application1.swf.

Ta technika jest przydatna, jeśli chcemy, aby starsza aplikacja dynamicznie załadowała nowszą wersję tej samej aplikacji bez powodowania konfliktów. Konflikt nie występuje, ponieważ mimo użycia tych samych nazw klas, są one oddzielone od siebie w różnych domenach aplikacji.

Poniższy kod tworzy domenę aplikacji podrzędną względem domeny systemowej i rozpoczyna ładowanie pliku SWF do tej domeny aplikacji.

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

Użycie B:
Dodajemy nowe definicje klas do bieżących definicji klas. Jako domena aplikacji pliku module1.swf jest wybierana domena bieżąca (Domena aplikacji 1). Dzięki temu możliwe jest dodawanie nowych definicji klas do bieżącego zestawu definicji klas aplikacji. Takie rozwiązanie może być stosowane dla bibliotek współużytkowanych w czasie wykonywania aplikacji głównej. Załadowany plik SWF jest traktowany jako zdalna biblioteka współużytkowana (RSL, and. remote shared library). Ta technika służy do ładowania bibliotek RSL w kodzie wstępnym, przed uruchomieniem aplikacji.

Poniższy kod ładuje plik SWF i jako jego domenę aplikacji wybiera domenę bieżącą:

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

Użycie C:
Używamy definicji klas nadrzędnych, tworząc nową domenę podrzędną bieżącej domeny. Domena aplikacji pliku module3.swf jest podrzędna względem bieżącej domeny, a moduł podrzędny używa wersji nadrzędnych wszystkich klas. Taką technikę można byłoby zastosować np. w module wieloekranowej rozbudowanej aplikacji internetowej. Moduł byłby ładowany jako podrzędny względem aplikacji głównej i korzystał z jej typów. Jeśli możliwe jest zagwarantowanie, że wszystkie klasy będą zawsze aktualizowane i zgodne wstecz, a aplikacja ładująca będzie zawsze nowsza od modułów, które ładuje, moduły podrzędne będą używały wersji nadrzędnych. Utworzenie nowej domeny aplikacji pozwala także na usunięcie wszystkich definicji klas i oczyszczenie pamięci, o ile tylko możliwe jest zagwarantowanie braku odwołań do podrzędnego pliku SWF.

Ta technika umożliwia współużytkowanie obiektów singleton i elementów klas statycznych modułu ładującego.

Poniższy kod tworzy nową domenę podrzędną względem bieżącej domeny i rozpoczyna ładowanie pliku SWF do tej domeny podrzędnej:

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