Obwohl das theoretische Verständnis eine wichtige Grundlage für den Einsatz des Frameworks ist, erschließt sich die Funktionsweise in der Regel erst in der praktischen Anwendung. Die Einarbeitung in das Framework anhand des beschriebenen Login-Beispiels wäre deswegen ein sinnvoller nächster Schritt.
Die kompletten Quellcodes inklusive erklärender Kommunikationsdiagramme können hier heruntergeladen werden. Um einen Einstieg in das konkrete Codebeispiel zu vereinfachen, veranschaulicht der nächste Abschnitt den PureMVC-Initialisierungsprozess.
Vorweg ist die PureMVC-Klassenbibliothek entweder als kompilierte SWC-Datei oder direkt als AS3-Klassenpaket in den Library-Ordner (meist "libs" genannt) des Flex-Projekts einzubinden. Der Vorteil einer Einbindung als AS3-Klasse besteht darin, den Quellcode des Frameworks browsen zu können. Beide Varianten lassen sich unter diesem Link herunterladen. Im Anschluss wird im "src"-Ordner des Projekts die Standard-PureMVC-Struktur wie in Abbildung 7 angelegt.
Package-Layout PureMVC (Abb. 7)
Das Paket "controller" enthält alle Commands, das Paket "model" alle Proxies, und im Unterpaket "vo" finden sich alle Value Objects. Mediators und Flex-Komponenten befinden sich im Paket "view" und im Unterpaket "components". Ist die Paketstruktur geschaffen und PureMVC mit dem Projekt verknüpft, kann die Initialisierung des Frameworks beginnen.
Zu Beginn erweitert man dafür die Klasse Facade zur ApplicationFacade-Klasse. Es ist zu beachten, dass die ApplicationFacade ein Singleton ist, eine Klasse mit nur einer Instanz. Auf sie lässt sich über die Methode getInstance() zugreifen.
Im nächsten Schritt ist die von der Anwendung benötigte Notification anzulegen. Obwohl anfangs lediglich die "startup" Notification existiert, kommen im Laufe der Entwicklung eines Projekts zahlreiche neue Notifications hinzu, die entweder direkt als statische Konstanten in die ApplicationFacade geschrieben oder in eine Extra-Klasse ausgelagert werden können.
Nach der Instanzierung der ApplicationFacade durchläuft PureMVC eine Reihe interner Routinen. Unter anderem den Aufruf der Methode initializeController(), in der sich vorher erstellte Commands mit den dazugehörigen Notifications verknüpfen können. Im einfachsten Fall verbindet man die startup Notification mit dem StartupCommand.
public class ApplicationFacade extends Facade implements IFacade
{
/*
* 2. NOTIFICATION IDs
*/
public static const STARTUP:String = "startup";
/*
* 1. Singleton Implementierung
*/
public static function getInstance():ApplicationFacade
{
if( instance == null )
instance = new ApplicationFacade();
return instance as ApplicationFacade;
}
/*
* 3. Notification IDs mit Commands verknüpfen (Command Mapping)
*/
override protected function initializeController():void
{
super.initializeController();
registerCommand( STARTUP, StartupCommand );
}
}
Bevor sich das StartupCommand und die startup Notification mit der Methode registerCommand() verknüpft, ist das Command erst im Paket "controller" zu erstellen. In der Regel registiert es Proxies und Mediators der Anwendung.
public class StartupCommand extends SimpleCommand implements ICommand
{
override public function execute( notification:INotification ):void
{
/*
* Die Referenz auf die Hauptkomponente der Anwendung (PMVC_Login)
* ist innerhalb des Bodies der Notification gespeichert
*/
var appview:PMVC_Login = notification.getBody() as PMVC_Login;
/*
* 1a. Registriere Mediators
*/
facade.registerMediator( new ApplicationMediator( appview ) );
/*
* 1b. Registriere Proxies
*/
facade.registerProxy( new ConfigProxy() );
/*
* 2. Lade Konfiguration
*/
var proxy:ConfigProxy = facade.retrieveProxy( ConfigProxy.NAME ) as
ConfigProxy;
proxy.loadConfig();
}
}
}
Von hier aus lassen sich zum Beispiel Konfigurationsdateien über einen Proxy laden. Ist die ApplicationFacade und das StartupCommand angelegt, ist die "startup" Notification im Anschluss an den Event creationComplete von der Haupt-Flex-Komponente aus zu senden.
Es ist zu beachten, dass die Flex-Komponente der Notification eine Referenz von sich übergibt, damit sie sich innerhalb des StartupCommand beispielsweise an den ApplicationMediator weitergeben lässt.
<mx:Application
xmlns:mx="http://www.adobe.com/2006/mxml"
creationComplete="init();">
<mx:Script >
<![CDATA[
private function init():void
{
//Initialisierung der Facade / PMVC Framework()
var facade:ApplicationFacade = ApplicationFacade.getInstance();
// Sende Startup Notification
facade.sendNotification( ApplicationFacade.STARTUP, this );
}
</mx:Script>
</mx:Application>
Auf der nächsten Seite: Fazit
Themenforum: Java