Я добился большого успеха с модульным приложением, в котором основное приложение в основном состоит из загрузчика модулей, который изначально загружает модуль входа в систему.
Как только модуль входа в систему выполняет свои функции (в моем случае проверенные входные данные, называемые службой входа в систему и извлекают токен), он отправляет событие (образно называемое «LogonEvent»), которое содержит сведения, необходимые для основного приложения. Я должен отметить, что сам модуль входа в систему является просто оболочкой для компонента входа в систему, который выполняет всю реальную работу (поэтому компонент входа в систему можно использовать в модуле или ViewStack и т. Д.). Наличие LogonEvent имеет все значение.
Приложение-оболочка обрабатывает событие входа в систему, выгружая модуль входа в систему, загружая основной модуль, содержащий содержимое приложения, и затем устанавливает необходимые данные для входа в загруженный модуль.
Кнопка выхода из системы находится в приложении-оболочке, так что она может выгрузить основной модуль и перезагрузить модуль входа в систему, готовый снова войти в систему.
Преимущество такого типа компоновки заключается в том, что сравнительно небольшой модуль входа в систему загружается довольно быстро. И пока пользователь входит в систему, основной модуль уже загружается предварительно, поэтому обычно не требуется ждать загрузки основного модуля после входа в систему. Если у вас есть одно большое монолитное приложение, начальное время загрузки может быть отложено.
Некоторые фрагменты кода, которые могут помочь ...
private var mainModuleLogOnEventDispatcher:*;
[Bindable]
private var _logOnDetails:LogOnDetails = new LogOnDetails();
private function onCreationComplete(event:Event):void
{
// Load log on module.
loadMainModule("LogOnModule.swf");
// Pre-load main module while user is logging on.
var mm:IModuleInfo = ModuleManager.getModule("MainModule.swf");
mm.load();
}
[Bindable]
private function set logOnDetails(value:LogOnDetails):void
{
_logOnDetails = value;
}
private function get logOnDetails():LogOnDetails
{
return _logOnDetails;
}
private function loadMainModule(moduleName:String):void
{
// Unload anything already loaded.
if (mainModule.url.length > 0)
{
mainModule.unloadModule();
mainModule.url = "";
}
mainModule.addEventListener(ModuleEvent.READY, handleMainModuleReadyEvent);
mainModule.url = moduleName;
}
private function handleMainModuleReadyEvent(event:ModuleEvent):void
{
// Remove listener, we've caught the event now.
mainModule.removeEventListener(ModuleEvent.READY, handleMainModuleReadyEvent);
// Add listeners to other events or apply data.
if (mainModule.url == "LogOnModule.swf")
{
mainModuleLogOnEventDispatcher = mainModule.child;
if (mainModule.child != null) {
mainModuleLogOnEventDispatcher.addEventListener("logOnEvent", handleLogOnEvent);
}
}
if (mainModule.url == "MainModule.swf")
{
var mm:* = mainModule.child;
if (mainModule.child != null)
{
mm.logOnDetails = logOnDetails;
}
}
}
private function handleLogOnEvent(logOnEvent:LogOnEvent):void
{
mainModuleLogOnEventDispatcher.removeEventListener("logOnEvent", handleLogOnEvent);
logOnDetails = logOnEvent.logOnDetails;
// Now get person's details and swap in main module if successful.
var parameters:Object = new Object();
parameters.cmd = "viewPerson";
parameters.token = logOnDetails.logOnToken;
viewPersonRequest.send(parameters);
}
private function handleViewPersonRequestResult(event:ResultEvent):void
{
//*** Loads of setting logonDetails and error handling removed!!! ***//
loadMainModule("MainModule.swf");
currentState = "LoggedOn";
return;
}
private function onLogOff(event:MouseEvent):void
{
// Make sure we don't auto-logon when we log off.
var logOnPrefs:SharedObject = SharedObject.getLocal("LogOn", "/");
logOnPrefs.data.loggedOff = true;
var parameters:Object = new Object();
parameters.cmd = "logoff";
parameters.token = logOnDetails.logOnToken;
logoffRequest.send(parameters);
loadMainModule("LogOnModule.swf");
currentState = "";
}
<!-- *** Loads of view state related mxml removed *** -->
<mx:VBox width="100%" height="100%" horizontalAlign="center" verticalAlign="middle" id="mainModuleVBox">
<basic:IJModuleLoader id="mainModule" url="" width="100%" height="100%" horizontalAlign="center" verticalAlign="middle"/>
</mx:VBox>
Следует также отметить, что это приложение-обертка на самом деле не является приложением! На самом деле это сам модуль, который загружается приложением Flex или AIR. Таким образом, у меня могут быть отдельные проекты Flex и AIR, которые ссылаются на основной библиотечный проект, который содержит модуль приложения, модуль входа в систему, основной модуль (после входа в систему) и в основном все остальные компоненты и классы, используемые приложением.