Nach der Einführung in das Robotlegs ActionScript-Framework gibt es nun ein weiteres Robotlegs-Beispiel. Schwerpunkt der Erklärung liegt auf den „Services” der MVCS-Referenzimplentierung von Robotlegs.

Was sind Services? Services sind zuständig, eine Anwendung mit Daten von externen Quellen zu versorgen. Dies kann z.B. die Anfragen an Datenbanken, das Filesystem, Webservices oder Webseiten-APIs sein. Die externe Anbindung wird also in eine Serviceklasse gekapselt.

Services encapsulate this interaction with external entities, and manage the results, faults, and other events that result from this interaction.

Als Beispiel für einen Service verwende ich die Twitter-Suche, die den aktuellste Tweet mit dem Hashtag #Flash zurückliefert (siehe Tweetr — Twitter-API für Flash).

Robotlegs und Flex Framework

Übrigens: Ich habe dieses Mal das Flex-Framework verwendet. Es wird deutlich, wie sich der Robotlegs-Aufbau eines reinen ActionScript-Projekts (siehe voriger Artikel) ebenso mit einem Flex-Projekt durchführen lässt.

Der einziger wesentliche Unterschied besteht bei meinem Beispiel darin, dass die Hauptdatei (main.mxml) den Context mithilfe von MXML aufruft und die MXML-basierte Viewkomponente (TweetBox) auf der Bühne platziert.

XML:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. :Application
  3.     xmlns:mx="http://www.adobe.com/2006/mxml"
  4.     xmlns:flexexample="de.florianplag.robotlegs.flexexample.*"
  5.     xmlns:view="de.florianplag.robotlegs.flexexample.view.*"
  6.     backgroundColor="0xffffff"
  7.     >
  8.     :MainContext contextView="{this}" />   
  9.     :TweetBox />   
  10. :Application>

Beispiel anschauen

Get Adobe Flash player

Ablauf

Im Folgenden eine kurze Beschreibung der Abläufe, wenn der Service benutzt wird.

Buttonklick führt Command aus

Beim Klick auf den loadButton in der View wird von der Mediator-Klasse ein Event ausgelöst.

Actionscript:
  1. dispatch(new FlowEvent(FlowEvent.LOAD_LATEST_TWEET))

Mapping des Events im Context

Die Zuordnung für dieses Event zum entsprechenden Command mit dem Namen LoadLatestTweet erfolgt im Context. Als Folge wird deshalb LoadLatestTweet ausgeführt.

Actionscript:
  1. commandMap.mapEvent(FlowEvent.LOAD_LATEST_TWEET, LoadLatestTweet);

Command ruft Service auf

Die Klasse LoadLatestTweet ruft den Twitter-Service auf, den es injiziert bekommt (mehr zum Inject weiter unten).

Actionscript:
  1. public class LoadLatestTweet extends Command {
  2.        
  3.     [Inject]
  4.     public var service:ITwitterService;
  5.    
  6.     public function LoadLatestTweet() {  
  7.     }
  8.  
  9.     override public function execute():void {
  10.         service.getLatestTweet();      
  11.     }

Service liefert Resultat als Event

Der Service sucht nach dem aktuellsten Tweet und liefert das Ergebnis als Payload eines Events.

Actionscript:
  1. var evt:SingleTweetEvent = new SingleTweetEvent(SingleTweetEvent.RESULT);
  2. evt.text = tweet.text;
  3. evt.tweetAge = TweetUtil.returnTweetAge(tweet.createdAt);
  4. evt.userProfileImage = tweet.userProfileImage;
  5. dispatch(evt);

Service

Für den Beispiel-Twitter-Service gibt es ein einfaches Interface, ITwitterService. Dieses definiert, dass es die Methode getLatestTweet geben muss.

Actionscript:
  1. public interface ITwitterService {
  2.      function getLatestTweet():void;   
  3. }

Im Beispiel habe ich zwei Klassen, die dieses Interface implementieren: TwitterMockupService und TwitterSearchService. Die erste ist gar kein echter Service, sondern liefert nur Testdaten. Die zweite Klasse nutzt Tweetr und führt eine echte Abfrage durch.

Das Praktische ist nun, dass man bei der Erstellung des Service-Objekts im Context problemlos den tatsächlichen Service wechseln kann (da beide das gleiche Interface implementieren). Auch ein zukünftiger Austausch des Service ist kein Problem, z.B. könnte man auch stattdessen den Twitter-XML-Feed auslesen. Somit hat man eine saubere Trennung des Services vom restlichen Code.

Actionscript:
  1. // Singleton für den Service erstellen
  2. injector.mapSingletonOf(ITwitterService, TwitterSearchService);
  3.  
  4. // Für Mockup-/Dummycontent stattdessen diese Zeile hier verwenden:
  5. //injector.mapSingletonOf(ITwitterService, TwitterMockupService);

Hier das Beispiel mit dem „gefakten” Service.

Get Adobe Flash player

Wer noch Ergänzungen oder Fragen hat, einfach einen Kommentar hinterlassen.

Download: Quelldateien (.zip)