Работа с доменами приложений

Flash Player 9 и более поздних версий, Adobe AIR 1.0 и более поздних версий

Класс ApplicationDomain предназначен для хранение таблицы определений ActionScript 3.0. Все программные коды в SWF-файле определены для существования в домене приложения. Домены приложений служат для разделения классов, находящихся в одном домене безопасности. Это обеспечивает возможность существования нескольких определений одного класса, а также позволяет дочерним элементам повторно использовать определения родительских элементов.

Домены приложений можно использовать при загрузке внешних SWF-файлов, написанных на языке ActionScript 3.0, с помощью API-интерфейса класса Loader. (Обратите внимание, что домены приложений нельзя использовать для загрузки изображений или SWF-файлов, написанных на языке ActionScript 1.0 или ActionScript 2.0.) Все определения ActionScript 3.0 в загруженном классе хранятся в домене приложения. Загружая SWF-файл, можно включить его в тот же домен приложения, что и объект Loader, задав для параметра applicationDomain объекта LoaderContext значение ApplicationDomain.currentDomain . Разместив загруженный SWF-файл в том же домене приложений, можно вызывать его классы напрямую. Это полезно, если в загружаемом SWF-файле есть встроенное мультимедийное содержимое, которое можно получить через соответствующие имена классов, или если требуется получить доступ к методам загруженного SWF-файла.

В следующем примере показано, что имеется доступ к отдельному файлу Greeter.swf, который определяет публичный метод с именем 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 
        } 
    } 
}

Дополнительные сведения см. в примере класса ApplicationDomain в cправочнике ActionScript® 3.0 для платформы Adobe® Flash® Platform .

При работе с доменами приложений следует помнить следующее.

  • Все программные коды в SWF-файле определены для существования в домене приложения. Текущим доменом приложения является домен, где выполняется основное приложение. Системный домен содержит все домены приложений, включая текущий домен, и это означает, что он содержит все классы проигрывателя Flash Player.

  • Все домены приложений, кроме системного, имеют связанный родительский домен. Родительским доменом для домена основного приложения является системный домен. Загруженные классы определяются только в том случае, если они уже не определены в своих родительских классах. Нельзя перезаписать определение загруженного класса новым определением.

На следующей схеме показано приложение, которое загружает содержимое из разных SWF-файлов в одном домене, domain1.com. В зависимости от загружаемого содержимого, можно использовать разные домены приложений. Далее описывается логика назначения соответствующего домена приложения для каждого SWF-файла в приложении.

Полноразмерное изображение
А.
Использование А

Б.
Использование В

B.
Использование C

Основным файлом приложения является application1.swf. Он содержит объекты Loader, которые загружают содержимое из других SWF-файлов. По данному сценарию текущий домен приложения — Application domain 1 (Домен приложения 1). Использования А, B и C демонстрируют разные методы назначения соответствующего домена приложения для каждого SWF-файла в приложении.

Использование А
Дочерний SWF-файл отделяется путем создания дочернего элемента системного домена. На схеме домен Application domain 2 создается как дочерний элемент системного домена. Файл application2.swf загружается в домен Application domain 2, таким образом, его определения классов отделяются от классов, определенных в файле application1.swf.

Этот прием применяется, чтобы старая версия приложения в динамическом режиме загрузила более новую версию, не создавая конфликта. Конфликт не возникает, так как одноименные классы сохранены раздельно, в разных доменах приложений.

Следующий код создает домен приложения, который является дочерним элементом системного домена, и начинает загружать SWF-файл с использованием этого домена.

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

Использование В
К текущим определениям классов добавляются новые. В качестве домена приложения для module1.swf назначен текущий домен (Application domain 1). Это позволяет добавлять новые определения классов в текущий набор определений данного приложения. Этот метод можно использовать для динамической общей библиотеки основного приложения. Загружаемый SWF-файл обрабатывается как удаленная общая библиотека (RSL). Используйте этот прием для загрузки библиотек RSL программой предварительной загрузки до запуска приложения.

Следующий код загружает SWF-файл, назначая текущий домен в качестве домена приложения.

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

Использование C
Родительские определения классов используются путем создания нового дочернего домена для текущего домена. Доменом приложения для module3.swf является дочерний элемент текущего домена, и этот дочерний элемент использует родительские версии всех классов. Этот метод можно использовать для создания модуля многоэкранного мультимедийного интернет-приложения (RIA), загруженного в качестве дочернего элемента основного приложения и использующего типы данных основного приложения. Если есть возможность обеспечить, чтобы все классы всегда обновлялись для совместимости с более ранними версиями и чтобы загружающее приложение было новее загружаемых файлов, то дочерние домены будут использовать родительские версии. Создание нового домена приложения также позволяет выгружать все определения классов для сборки мусора, если предварительно удалить все ссылки на дочерний SWF-файл.

Этот метод позволяет загруженным модулям совместно использовать единичные объекты и статические элементы класса загружающего файла.

Следующий код создает дочерний домен для текущего домена и начинает загрузку SWF-файла с использованием нового домена приложений.

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