<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>La Fabrick &#187; architecture</title>
	<atom:link href="http://www.lafabrick.com/blog/tag/architecture/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.lafabrick.com/blog</link>
	<description>Laboratoire d&#039;interfaces riches (Flex, Flash, Air ...)</description>
	<lastBuildDate>Mon, 28 Nov 2011 22:02:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.4</generator>
		<item>
		<title>Flex 4 et les layouts &#8211; Faire une ViewStack &#171;&#160;pure&#160;&#187; Spark</title>
		<link>http://www.lafabrick.com/blog/2010/07/14/1920-flex-4-layouts-viewstack-pure-spark/</link>
		<comments>http://www.lafabrick.com/blog/2010/07/14/1920-flex-4-layouts-viewstack-pure-spark/#comments</comments>
		<pubDate>Wed, 14 Jul 2010 16:06:03 +0000</pubDate>
		<dc:creator>Hervé</dc:creator>
				<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[flex4]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Spark]]></category>
		<category><![CDATA[UI Design]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=1920</guid>
		<description><![CDATA[Pour ceux d&#8217;entre vous qui ont eu la chance de passer à Flex 4, vous avez peut-être la même tendance que moi à chercher à éviter le préfixe &#60;mx:&#62; dans vos skins&#8230; Spark, quand tu nous tiens&#8230; Quoi qu&#8217;il en soit, certains types de composants n&#8217;ont pas été réécris pour Spark. Pourquoi ? Parce l&#8217;architecture [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-medium wp-image-1930" title="layouts" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/layouts-300x155.png" alt="layouts" width="300" height="155" /><br />
Pour ceux d&#8217;entre vous qui ont eu la chance de passer à Flex 4, vous avez peut-être la même tendance que moi à chercher à éviter le préfixe &lt;mx:&gt; dans vos skins&#8230; Spark, quand tu nous tiens&#8230; Quoi qu&#8217;il en soit, certains types de composants n&#8217;ont pas été réécris pour Spark. Pourquoi ? Parce l&#8217;architecture Spark propose quelque chose de top : les layouts. Et les layouts, c&#8217;est vaaaachement bien.</p>
<p>Explication&#8230;<br />
<span id="more-1920"></span></p>
<h2>Layouts</h2>
<p>Sans faire un article complet sur les layout (ce qui serait tout à fait possible et intéressant), on peut tout de même rappeler que le Flex 4 se distingue de Flex 3 via Spark par une volonté de mieux séparer le fond de la forme, il amène donc une notion de layout pour, comme son nom le suggère, organiser les composants d&#8217;un conteneur (par exemple un &lt;s:Group&gt;).<br />
Exit donc la <em>VBox</em> ou la <em>HBox</em> (même si le VGroup ou le HGroup permettent de faire une transition en douceur), et bienvenue au <strong>Group</strong> avec layout :</p>
<pre class="brush: xml">
&lt;mx:VBox&gt;
&lt;/mx:VBox&gt;
</pre>
<p>devient donc</p>
<pre class="brush: xml">
&lt;s:Group&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout /&gt;
&lt;/s:layout&gt;
&lt;/s:Group&gt;
</pre>
<p>Au premier abord on dit : c&#8217;est plus verbeux ! Oui mais&#8230; le layout a cette particularité, en tant que propriété du composant, d&#8217;être modifiable à la volée, contrairement à un composant imposant sa mise en forme. Concrètement, là où la <em>VBox</em> présentera toujours ses enfants verticalement (c&#8217;est son nom !), le <em>Group</em> pourra changer à volonté de layout, donc très facilement passer de <em>HorizontalLayout</em> à <em>VerticalLayout</em> par exemple&#8230; On comprend encore mieux l&#8217;intérêt quand on se met à écrire son propre layout pour faire des choses un peu plus poussées visuellement !</p>
<h2>Créer son layout</h2>
<p>Pour créer un layout, il faut étendre la classe LayoutBase et surcharger a minima la méthode updateDisplayList() et certainement la méthode measure(). Ces méthodes gardent le même rôle qu&#8217;en Flex 3, mais avec l&#8217;adaptation contextuelle au Layout :</p>
<ul>
<li>updateDisplayList : dispose les enfants du conteneur et définit leur taille</li>
<li>measure : donne la taille globale du conteneur</li>
</ul>
<p>Vous pouvez accéder à la propriété &laquo;&nbsp;target&nbsp;&raquo; du layout qui correspond au conteneur auquel est appliqué le layout et travailler sur les enfant via les méthodes getElementAt() ou getVirtualElementAt(). La seconde méthode sert dans le cas où le layout est dit &laquo;&nbsp;virtualisé&nbsp;&raquo;.</p>
<h3>Apparté : virtualisation de layout</h3>
<p>Flex 4 permet, pour des raison de performance, d&#8217;utiliser un layout en mode &laquo;&nbsp;virtualisé&nbsp;&raquo;, c&#8217;est-à-dire ne calculant la disposition des seuls enfants à afficher et non l&#8217;ensemble des enfants. Ce mode de fonctionnement s&#8217;applique particulièrement bien aux composants comprenant une liste de beaucoup d&#8217;enfants, mais ne calculant l&#8217;affichage d&#8217;une poignée à la fois, le reste attendant un scroll ou une action similaire pour être éventuellement affiché.</p>
<h2>Application : création d&#8217;un ViewStackLayout</h2>
<p>Avec les layouts en tête, il est inutile de demander pourquoi le composant ViewStack n&#8217;existe pas dans Spark : il devrait en pratique être un layout applicable à n&#8217;importe quel conteneur ! Même si le <a lang="en" href="http://opensource.adobe.com/wiki/display/flexsdk/Spark+Virtualization">très bon article sur la virtualisation</a> mentionne un prometteur je cite &laquo;&nbsp;(Planned) StackLayout&nbsp;&raquo;, rien ne nous empêche d&#8217;en faire un simple, adapté à l&#8217;architecture Spark, plutôt que d&#8217;attendre (oui on est impatients à la fabrick).</p>
<p>Voici un exemple simple :</p>
<pre class="brush: js">
	import mx.core.IVisualElement;
	import spark.layouts.supportClasses.LayoutBase;

	public class ViewStackLayout extends LayoutBase {
		public function ViewStackLayout() {
			super();
		}

		protected var _index:uint;

		public function get index():Number {
			return _index;
		}

		public function set index(value:Number):void {
			if (_index != value &amp;&amp; target != null &amp;&amp; value &gt;= 0 &amp;&amp; value &lt; target.numElements) {
				_index = value;
				target.invalidateSize();
				target.invalidateDisplayList();
			}
		}

		override public function updateDisplayList(width:Number, height:Number):void {
			var element:IVisualElement = useVirtualLayout ? target.getVirtualElementAt(index) : target.getElementAt(index);

			if (element) {
				element.setLayoutBoundsSize(element.getPreferredBoundsWidth(), element.getPreferredBoundsHeight());
				target.setActualSize(element.getPreferredBoundsWidth(), element.getPreferredBoundsHeight());
				target.setContentSize(element.getPreferredBoundsWidth(), element.getPreferredBoundsHeight());
			}
		}

		override public function measure():void {
			var count:int = target.numElements;

			for (var i:uint = 0; i &lt; count; i++) {
				var element:IVisualElement = useVirtualLayout ? target.getVirtualElementAt(i) : target.getElementAt(i);

				if (i == index) {
					element.visible = true;
					element.includeInLayout = true;
					target.measuredWidth = element.getPreferredBoundsWidth();
					target.measuredHeight = element.getPreferredBoundsHeight();
				} else {
					element.visible = false;
					element.includeInLayout = false;
				}
			}
		}
	}
</pre>
<p>Vous noterez ici l&#8217;usage du getVirtualElementAt, en prévision de la gestion de la virtualisation.<br />
Vous pouvez donc utiliser ce layout dans un DataGroup &laquo;&nbsp;piloté&nbsp;&raquo; par une tabbar par exemple comme ceci :</p>
<pre class="brush: xml">
&lt;s:TabBar id=&quot;tabEditors&quot; /&gt;
&lt;s:DataGroup id=&quot;editors&quot;&gt;
&lt;s:layout&gt;
&lt;mylayouts:ViewStackLayout index=&quot;{tabEditors.selectedIndex}&quot; /&gt;
&lt;/s:layout&gt;
&lt;!-- Enfants... --&gt;
&lt;/s:DataGroup&gt;
</pre>
<p>De cette façon, le jour où vous voudrez présenter ces éléments sous forme de CoverFlow, en mode TimeMachine&#8230; vous n&#8217;aurez pas à modifier le code de votre composant, mais uniquement votre skin.</p>
<p>Alors, on n&#8217;est pas mieux habillé en Spark ?Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2009/01/13/786-reflex-1-une-micro-architecture-pour-flex-simple/" rel="bookmark" title="13 janvier 2009">Reflex #1: une micro-architecture pour Flex&#8230; simple !</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/11/27/1373-flex4-custom-component-skinnig/" rel="bookmark" title="27 novembre 2009">Flex4 : composant personnalisé et skinning</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/05/04/1962-uigfx-practice-a-circularslider-component-2/" rel="bookmark" title="4 mai 2010">UIGFX practice : a CircularSlider component</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/03/05/1675-proches-de-lohio-les-etats-esthetes-de-flex4/" rel="bookmark" title="5 mars 2010">Proches de l&#8217;Ohio??? Les états esthètes de Flex4</a></li>
</ul>
<p><!-- Similar Posts took 16.517 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2010/07/14/1920-flex-4-layouts-viewstack-pure-spark/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Developing with AFCS a.k.a Cocomo &#8211; Introduction</title>
		<link>http://www.lafabrick.com/blog/2009/01/21/999-what-is-adobe-cocomo/</link>
		<comments>http://www.lafabrick.com/blog/2009/01/21/999-what-is-adobe-cocomo/#comments</comments>
		<pubDate>Tue, 20 Jan 2009 23:38:28 +0000</pubDate>
		<dc:creator>Hervé</dc:creator>
				<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[cocomo]]></category>
		<category><![CDATA[collaboration]]></category>
		<category><![CDATA[RIA]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[Tutoriels]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=999</guid>
		<description><![CDATA[[ 05.03.2009 : Update : Cocomo is now called Adobe Flash Collaboration Services / AFCS and 0.9.1 was released with some bug fixes and a new namespace ] Hey there! Here is, as a first English article, an introduction to Adobe Cocomo AFCS. (Translated from French tutorial on FlashXPress ) Cocomo is an abbreviation of [...]]]></description>
			<content:encoded><![CDATA[<p>[ 05.03.2009 : Update : Cocomo is now called Adobe Flash Collaboration Services / AFCS and 0.9.1 was released with some bug fixes and a new namespace ]</p>
<p>Hey there!<br />
Here is, as a first English article, an introduction to <del datetime="2009-03-06T00:25:09+00:00">Adobe Cocomo</del> AFCS.<br />
(Translated from <a href="http://www.flashxpress.net/ressources-flex/developper-avec-cocomo-introduction/"> French tutorial on FlashXPress </a>)</p>
<p style="text-align: center;"><a href="https://cocomo.acrobat.com/"><img class="aligncenter" title="AFCS/Cocomo developer account" src="http://lafabrick.free.fr/blogImg/cocomo-20090121-005745.png" alt="" width="520" height="180" /></a></p>
<p><span id="more-999"></span></p>
<p><strong> Cocomo </strong> is an abbreviation of «<strong>COmmon COllaboration MOdel</strong>», which was the first name given by Adobe to its new online service dedicated to <strong>collaborative application development</strong>. The final commercial name is Adobe Flash Collaboration Services a.k.a AFCS </p>
<p>This name both references :</p>
<ul>
<li>a <strong>SDK</strong> that includes a Flex components library and tools dedicated to multi-users applications development. Just so you know, those components are used by Adobe for developing ConnectNow, a video conference application part of the <a href="http://www.acrobat.com/">Acrobat.com</a> platform.</li>
<li>a <strong>free online service</strong> (with some limitations), enabling creation and deployment of collaborative applications on <a href="http://www.adobe.com/fr/products/flashmediaserver/">FMS</a> servers hosted and maintained by Adobe.</li>
</ul>
<p>In short, <del datetime="2009-03-06T00:25:09+00:00">Cocomo</del> AFCS will allow us to develop applications that will use real-time communications capabilities of FMS servers, without taking care of those servers&#8230; cooool !!!</p>
<p>But what are the «<strong>real-time communications</strong> capabilities of those FMS servers» ???</p>
<p>In fact, the <del datetime="2009-03-06T00:25:09+00:00">Cocomo</del> AFCS  servers will allow us to:</p>
<ul>
<li>exchange <strong>audio and video data flows</strong>, useful to create visioconference application for example,</li>
<li><strong>synchronize different types of data between multiple client applications</strong>. It allows you to add a chat to an existing application, to develop a co-navigation system, a document co-edition functionnality, some multi-users game&#8230;</li>
<li><strong>share files</strong></li>
<li><strong>manage user rights</strong> regarding their role</li>
</ul>
<p><img src="http://lafabrick.free.fr/blogImg/Cocomo_prez1-20090120-220414.png" alt="AFCS /  Cocomo  " /></p>
<p>This schema describes the interaction between a room, hosted on a developer account of a cocomo server, and some Flex clients : the host user (owner), an active guest (publisher), and a passive guest. The host send his webcam output, and both host and publisher can update notes on the server, these data are broadcasted to the other clients.</p>
<p>The library contains «high-level» graphical components, known as <strong>pods</strong>, but also some more «low-level» classes that a developer can use to create his own components (<strong>SharedModel</strong>, <strong>CollectionNode</strong>).</p>
<p><img src="http://lafabrick.free.fr/blogImg/Cocomo_Pods-2-3-20090121-003644.png" alt="AFCS / Cocomo built-in Pods" /></p>
<p>This schema shows an example of pods (Tchat, Notes, User management, Webcam and File sharing)</p>
<p>The pods are <strong>collaborative «plug’n’play» components</strong>, that we will use to create our first <del datetime="2009-03-06T00:25:09+00:00">Cocomo</del> AFCS  applications without having to write a single line of code (Tchat, Webcam, Notes&#8230;). The lower level classes will help us to go deeper and create components that will fit more specific needs.</p>
<p>But, first things first : let’s create a «<del datetime="2009-03-06T00:25:09+00:00">Cocomo</del> AFCS  Developer» account&#8230;</p>
<h3><del datetime="2009-03-06T00:25:09+00:00">Cocomo</del> AFCS  Developer account creation</h3>
<p>To create an account :</p>
<ul>
<li>Go to the <a href="https://cocomo.acrobat.com/"><del datetime="2009-03-06T00:25:09+00:00">Cocomo</del> AFCS  portal (https://cocomo.acrobat.com)</a>,</li>
<li>Create a <strong>new account</strong> (you can also use your existing Adobe account)</li>
<li>Choose a <strong><del datetime="2009-03-06T00:25:09+00:00">Cocomo</del> AFCS  account identifier</strong> («account name», room access URLs will be based on that identifier)
<ol>
<li>The Account URL situation in the screen</li>
<li>The Room instances panel (click the &laquo;&nbsp;Add&nbsp;&raquo; button)</li>
<li>The &laquo;&nbsp;Download SDK&nbsp;&raquo; button</li>
</ol>
</li>
<p><img src="http://lafabrick.com/blog/images/erick//AFCS_Developer_Portal-20090305-213035.jpg" alt="Cocomo Developper Console" /><br />
This capture represents the <del datetime="2009-03-06T00:25:09+00:00">Cocomo</del> AFCS  home page. It mainly illustrates the three steps to follow:</p>
<li>Once your account has been created, make sure to note your <strong>Account URL</strong></li>
<li>In the &laquo;&nbsp;<strong>Room instances</strong>&nbsp;&raquo; panel, create a new <strong>room. </strong>A room represents a &laquo;&nbsp;virtual meeting point&nbsp;&raquo; where several client application will be able to <strong>exchange audio / video flows, files or messages</strong>. Your account will allow you to create several rooms, with a single configuration for each room. A room is also identified by a URL that looks like <em>http://connectnow.acrobat.com/yourAccount/roomName</em>.</li>
<li>Once your room has been created, download the SDK.</li>
</ul>
<p>You&#8217;ll find within the downloaded ZIP:</p>
<ul>
<li><strong>documentation</strong></li>
<li><strong>application examples</strong></li>
<li>Air utilities: <strong><del datetime="2009-03-06T00:25:09+00:00">CocomoDevConsole</del> AFCSDevConsole</strong> for your accounts and rooms management, and <strong>LocalConnectionServer</strong>, a local <del datetime="2009-03-06T00:25:09+00:00">Cocomo</del> AFCS  server emulation that will allow you to test some of your applications features without having to connect to a &laquo;&nbsp;real&nbsp;&raquo; <del datetime="2009-03-06T00:25:09+00:00">Cocomo</del> AFCS  server (mainly messaging)</li>
<li>library <strong>sources</strong></li>
<li>library SWC for Flash Player 9 and Flash Player 10</li>
</ul>
<h3><del datetime="2009-03-06T00:25:09+00:00">Cocomo</del> AFCS  installation</h3>
<p>For this version (0.9), installation will reside in including <del datetime="2009-03-06T00:25:09+00:00">Cocomo</del> AFCS  library documentation at Eclipse&#8217;s one. To do so:</p>
<ul>
<li>create a &#8216;<em>com.adobe.afcs</em>&#8216; folder in the &#8216;<em>plugins</em>&#8216; folder of your Flex Builder installation<br />
<strong>Windows</strong>: C:\Program Files\Adobe\Flex Builder 3\plugins\com.adobe.afcs<br />
<strong>Macintosh</strong>: /Applications/Adobe Flex Builder 3/plugins/com.adobe.afcs</li>
<li>Copy the content of the downloaded file into that folder</li>
<li>(Re)Launch Flex Builder and open the help contents (Help / Help Contents)</li>
</ul>
<p>You should now find the <del datetime="2009-03-06T00:25:09+00:00">Cocomo</del> AFCS  API documentation</p>
<p><img src="http://lafabrick.free.fr/blogImg/cocomo_help-20081218-031802.jpg" alt="Cocomo Doc in Flex Builder / Eclipse" /><br />
This schema is a screen capture of the cocomo documentation opened within the Flex Builder environment.</p>
<p>And noooow&#8230; <a href="http://www.lafabrick.com/blog/2009/01/31/1040-hello-cocomo-first-app/">let&#8217;s collaborate</a> !!! <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /><br />
&gt;&gt; Next : <a href="http://www.lafabrick.com/blog/2009/01/31/1040-hello-cocomo-first-app/">My first <del datetime="2009-03-06T00:25:09+00:00">Cocomo</del> AFCS  Application</a>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/12/07/274-cocomo-dbarque-et-personne-me-prvient/" rel="bookmark" title="7 décembre 2007">Cocomo est là et personne me prévient ??!!</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/12/22/568-cocomo-kezako/" rel="bookmark" title="22 décembre 2008">Cocomo ? Kezako ?</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/12/23/591-cocomo-wiibot/" rel="bookmark" title="23 décembre 2008">Introducing r.CØ &#8230; First &laquo;&nbsp;Cocomo ready&nbsp;&raquo; Air Wiibot&#8230;</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/01/31/1040-hello-cocomo-first-app/" rel="bookmark" title="31 janvier 2009">Hello AFCS ( bye Cocomo ) : première application multi-utilisateurs</a></li>
</ul>
<p><!-- Similar Posts took 13.760 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2009/01/21/999-what-is-adobe-cocomo/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Reflex #2 : vous reprendrez bien un peu de IOC ?</title>
		<link>http://www.lafabrick.com/blog/2009/01/15/819-reflex-2-vous-reprendez-bien-un-peu-de-ioc/</link>
		<comments>http://www.lafabrick.com/blog/2009/01/15/819-reflex-2-vous-reprendez-bien-un-peu-de-ioc/#comments</comments>
		<pubDate>Wed, 14 Jan 2009 22:16:49 +0000</pubDate>
		<dc:creator>Fabien</dc:creator>
				<category><![CDATA[Bientôt chez vous]]></category>
		<category><![CDATA[La Fabrick]]></category>
		<category><![CDATA[Nos projets]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[IOC]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Tutoriels]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=819</guid>
		<description><![CDATA[Reflex intègre un système d’Injection de contenu, qui est l’une des représentations de l’IOC. Nous allons voir ici à quoi cela sert, et comment le mettre en œuvre dans Reflex. Si ce n’est déjà fait, je vous laisse jeter un œil sur la première partie de cette architecture, et de récupérer le swc avant de [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter" title="reflex image tuto 2" src="http://www.lafabrick.com/labz/reflex/images/reflexImgTuto2.jpg" alt="" width="520" height="230" /><br />
Reflex intègre un système d’Injection de contenu, qui est l’une des représentations de l’IOC.<br />
Nous allons voir ici à quoi cela sert, et comment le mettre en œuvre dans Reflex.</p>
<p>Si ce n’est déjà fait, je vous laisse jeter un œil sur <a href="http://www.lafabrick.com/blog/2009/01/13/786-reflex-1-une-micro-architecture-pour-flex-simple/">la première partie de cette architecture</a>, et de <a href="http://www.lafabrick.com/blog/reflex/">récupérer le swc</a> avant de lire la suite.<br />
<span id="more-819"></span></p>
<h3><strong>A quoi ça sert l’IOC ?</strong></h3>
<p>L’IOC ( Inversion Of Control ) est un patron d’architecture, possédant plusieurs représentations ( inversion de contrôle, injection de dépendance, &#8230;).  Je ne vais pas faire un cours sur l’Injection de contenu : je vous laisse <a href="http://fr.wikipedia.org/wiki/Inversion_de_contr%C3%B4le">voir ici </a>pour plus d’informations.</p>
<p>Dans Reflex, le but du package IOC est de décentraliser les objets de configurations de l’application. En gros, mettre les services d’accès aux données dans un fichier de configuration XML au lieu de les coder en dur dans l&#8217;application Flex.</p>
<p>Certains spécialistes me diront certainement que l’Injection de contenu n’est pas forcement une représentation de l’IOC, et donc un abus de langage pour Reflex : je répondrais par “traduisez ici IOC par Injection Of Content, et laissons tomber les patrons d’architecture !”.</p>
<h3><strong>Au commencement, le ServicesLocator</strong></h3>
<p>Nous avons vu dans la première partie comment réaliser simplement un appel à une méthode distante. Avoir un point d’accès global aux différents services est pratique lorsque l’on commence à avoir plusieurs services, ou si des vues différentes utilisent un service identique. Voyons comment procéder avec le premier exemple.</p>
<p>Reprenons l’exemple du <a href="http://www.lafabrick.com/blog/2009/01/13/786-reflex-1-une-micro-architecture-pour-flex-simple/">tuto #1</a> :  il faut charger <strong>les services</strong> dans le <strong>ServicesLocator</strong>. Nous allons donc modifier notre vue :</p>
<pre class="brush: xml">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;mx:Application
	xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot;
	layout=&quot;absolute&quot;

	creationComplete=&quot;init()&quot;

	xmlns:controller=&quot;controller.*&quot;
	xmlns:model=&quot;model.*&quot;&gt;

	&lt;mx:Script&gt;
		&lt;![CDATA[
			import com.lafabrick.reflex.service.ServicesLocator;

			public static const SERVICE_USER:String = &quot;userService&quot;;
			public static const SERVICE_OTHER:String = &quot;otherService&quot;;

			private function init() : void
			{
				ServicesLocator.addService( SERVICE_USER, remoteUser );
				ServicesLocator.addService( SERVICE_OTHER, remoteOther );

				userControl.service = ServicesLocator.getService( SERVICE_USER );
			}

		]]&gt;
	&lt;/mx:Script&gt;

	&lt;mx:RemoteObject id=&quot;remoteUser&quot;
		destination=&quot;javaFacadeUser&quot; showBusyCursor=&quot;true&quot; /&gt;

	&lt;mx:RemoteObject id=&quot;remoteOther&quot;
		destination=&quot;javaFacadeOther&quot; showBusyCursor=&quot;true&quot; /&gt;

	&lt;controller:UserController id=&quot;userControl&quot; /&gt;

	&lt;model:UserModel id=&quot;userModel&quot; /&gt;

	&lt;mx:VBox&gt;
		&lt;mx:TextInput id=&quot;login&quot; /&gt;
		&lt;mx:TextInput id=&quot;password&quot; displayAsPassword=&quot;true&quot; /&gt;

		&lt;mx:Button label=&quot;connect&quot;
			click=&quot;{userControl.login(login.text, password.text)}&quot; /&gt;

		&lt;mx:Label x=&quot;208&quot; y=&quot;44&quot;
			text=&quot;User Name : {userModel.userLogged.name}&quot;/&gt;
	&lt;/mx:VBox&gt;

&lt;/mx:Application&gt;
</pre>
<ul>
<li>À la création de l’application ( <em>creationComplete</em> ), nous déclenchons la fonction<strong> init();</strong>.</li>
<li>Nous ajoutons les services <strong>RemoteObject</strong> dans le <a href="http://www.lafabrick.com/labz/reflex/apidoc/com/lafabrick/reflex/service/ServicesLocator.html">ServicesLocator</a>. La signature de cette méthode est la suivante :
<pre class="brush: js">
ServicesLocator.addService( serviceName:String, serviceObject:AbstractService )
</pre>
<p> </p>
<ul>
<li>  <strong><em>  serviceName:String</em></strong> est le nom de référence utilisé pour indexer, et plus tard retrouver le bon service.</li>
<li><strong><em>serviceObject:AbstractService</em></strong> est l’identifiant (id) de l’object service (le RemoteObject). </li>
</ul>
</li>
<li>Nous supprimons la propriété <strong><em>service</em></strong> dans la déclaration mxml de <strong>UserController</strong>, pour la déclarer en ActionScript dans la fonction<strong> init()</strong>.   ServicesLocator.getService( serviceName:String ) renvoie l’instance du service défini par serviceName, référencée dans le locator.</li>
</ul>
<p><strong>Note</strong> : Au niveau de l’appel du service, nous pourrions appeler la méthode <strong>getController</strong> de <a href="http://www.lafabrick.com/labz/reflex/apidoc/com/lafabrick/reflex/controller/ControllerLocator.html">ControllerLocator</a>.</p>
<pre class="brush: js">
userControl.login(login.text, password.text); 
</pre>
<p>devient :</p>
<pre class="brush: js">
( ControllerLocator.getController( MonApplication.SERVICE_USER )
	as UserController ).login(login.text, password.text);
</pre>
<p>Dans ce cas, nous devons &laquo;&nbsp;caster&nbsp;&raquo; le retour de <strong>getController(&#8230;)</strong> en <strong>UserController</strong> ( sinon erreur ! Flex ne connaîtrait pas la méthode login )</p>
<h3><strong>Un composant pour la vue</strong></h3>
<p>Histoire de mettre en pratique un peu plus l’utilisation des “locators” de Reflex, nous allons créer un composant MXML étendant <strong>Canvas</strong>, qui va contenir la représentation visuelle de notre application. Nous allons utiliser <strong>ControllerLocator</strong> dans ce fichier pour récupérer le <strong>UserController</strong>.</p>
<pre class="brush: xml">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;mx:Canvas
	xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot;
	width=&quot;100%&quot;
	height=&quot;100%&quot;&gt;

	&lt;mx:Script&gt;
		&lt;![CDATA[
			import model.UserModel;
			import controller.UserController;
			import com.lafabrick.reflex.controller.ControllerLocator;
			import com.lafabrick.reflex.model.ModelLocator;

			[Bindable]
			private var userDataModel:UserModel =
				( ModelLocator.getModel( UserModel ) as UserModel);

		]]&gt;
	&lt;/mx:Script&gt;

	&lt;mx:VBox horizontalCenter=&quot;0&quot; verticalCenter=&quot;0&quot;&gt;
		&lt;mx:TextInput id=&quot;login&quot; /&gt;
		&lt;mx:TextInput id=&quot;password&quot; displayAsPassword=&quot;true&quot; /&gt;

		&lt;mx:Button
			label=&quot;connect&quot;
			click=&quot;{ ( ControllerLocator.getController( UserController )
				as UserController ).login( login.text, password.text )}&quot; /&gt;

		&lt;mx:Label x=&quot;208&quot; y=&quot;44&quot;
			text=&quot;User Name : {userDataModel.userLogged.name}&quot;/&gt;
	&lt;/mx:VBox&gt;

&lt;/mx:Canvas&gt;
</pre>
<p>Pour que le “<strong>Binding</strong>” fonctionne correctement entre la vue et le modèle, nous devons utiliser des pointeurs vers les modèles à utiliser.</p>
<h3><strong>Le fichier de configuration XML (IOC)</strong></h3>
<p>Nous venons de voir comment utiliser le <a href="http://www.lafabrick.com/labz/reflex/apidoc/com/lafabrick/reflex/service/ServicesLocator.html">ServiceLocator</a>. Intégrons maintenant le système <strong>IOC</strong> pour ne plus avoir à le gérer  !</p>
<p>Ce fichier vous permet de décrire des objets, pour ensuite les récupérer et les instancier dans votre application ( via <a href="http://www.lafabrick.com/labz/reflex/apidoc/com/lafabrick/reflex/ioc/ApplicationContext.html">ApplicationContext</a> ). Ce fichier s’inspire fortement des fichiers de configuration de Spring, un framework puissant pour Java.</p>
<p>Ci-dessous le fichier représentant 2 services <strong>RemoteObject</strong> :</p>
<pre class="brush: xml">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;objects&gt;

	&lt;object id=&quot;remotingUser&quot; className=&quot;mx.rpc.remoting.mxml.RemoteObject&quot;&gt;
		&lt;property name=&quot;destination&quot; className=&quot;String&quot;&gt;javaFacadeUser&lt;/property&gt;
		&lt;property name=&quot;showBusyCursor&quot; className=&quot;Boolean&quot;&gt;true&lt;/property&gt;
	&lt;/object&gt;

	&lt;object id=&quot;remotingOther&quot; className=&quot;mx.rpc.remoting.mxml.RemoteObject&quot;&gt;
		&lt;property name=&quot;destination&quot; className=&quot;String&quot;&gt;javaFacadeOther&lt;/property&gt;
		&lt;property name=&quot;showBusyCursor&quot; className=&quot;Boolean&quot;&gt;true&lt;/property&gt;
	&lt;/object&gt;

&lt;/objects&gt;
</pre>
<ul>
<li>Le tag <strong>&lt;objects&gt;</strong> englobe les différents objets définis dans le fichier. Il est défini par :</li>
<li>Un objet <strong>&lt;object&gt;</strong> est défini par :
<ul>
<li>un identifiant <strong><em>id</em></strong>. Cet id est celui que nous utiliserons plus tard dans l’application Flex pour retrouver et instancier l’objet.</li>
<li> un nom de classe <strong><em>className</em></strong> : la classe de référence.</li>
</ul>
</li>
<li>Les propriétés des objets sont définies par :
<ul>
<li>leur nom <strong><em>name</em></strong></li>
<li>leur classe <strong><em>className</em></strong> de référence.</li>
</ul>
</li>
</ul>
<p>Ici, un <a href="http://livedocs.adobe.com/flex/3/langref/mx/rpc/remoting/mxml/RemoteObject.html">RemoteObject</a> a besoin de 2 propriétés : la <em>destination</em> du type String, et éventuellement <em>showBusyCursor</em> du type Boolean.</p>
<h3><strong>Régler le problème d’inclusion de classe</strong></h3>
<p>Le “petit” problème de ce système est que la déclaration externe des objets fait que les classes ne sont pas intégrées dans le projet Flex. Le compilateur Flex ne trouve pas de référence aux classes, et ne les intègre donc pas dans la compilation. Un façon très simple de régler ce problème est de créer un petit fichier actionScript, et d’ajouter des objets bidons du même type que ceux définis dans votre fichier de config.</p>
<p>Exemple avec les services : (fichier includeService.as)</p>
<pre class="brush: js">
import mx.rpc.http.mxml.HTTPService;
import mx.rpc.remoting.mxml.RemoteObject;
import mx.rpc.soap.mxml.WebService;

private var ser1:RemoteObject;
private var ser2:HTTPService;
private var ser3:WebService;
</pre>
<p>Ce fichier sera intégré dans votre application.</p>
<h3><strong>Chargement et gestion du contexte XML</strong></h3>
<p>Vous allez voir : simple comme bonjour !<br />
Nous allons ajouter le chargement du fichier via <a href="http://www.lafabrick.com/labz/reflex/apidoc/com/lafabrick/reflex/ioc/ApplicationContext.html">ApplicationContext</a>. <strong>ApplicationContext</strong> permet de charger automatiquement le contexte cible, et de retrouver, instancier, et<strong> enregistrer automatiquement tous les service</strong>s qui se trouvent dans votre fichier de configuration XML dans le <strong>ServicesLocator</strong>.</p>
<p>Votre application finale :</p>
<pre class="brush: xml">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;mx:Application
	xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot;
	layout=&quot;absolute&quot;

	creationComplete=&quot;init()&quot;

	xmlns:model=&quot;model.*&quot;
	xmlns:view=&quot;view.*&quot;
	xmlns:controller=&quot;controller.*&quot;
	xmlns:service=&quot;service.*&quot;&gt;

	&lt;mx:Script&gt;
		&lt;![CDATA[
			import com.lafabrick.reflex.ioc.event.ContextEvent;
			import com.lafabrick.reflex.ioc.ApplicationContext;
			import com.lafabrick.reflex.controller.ControllerLocator;
			import com.lafabrick.reflex.service.ServicesLocator;

			include &quot;includeService.as&quot;

			private function init() : void
			{
				ApplicationContext.addEventListener(
					ContextEvent.CONTEXT_LOADED, onLoaded );

				ApplicationContext.load( &quot;ioc/application-config.xml&quot; );
			}

			private function onLoaded( event:ContextEvent ) :void
			{
				// Contexte chargé
				// ...
			}

		]]&gt;
	&lt;/mx:Script&gt;

	&lt;controller:UserController id=&quot;userControl&quot; /&gt;

	&lt;model:UserModel id=&quot;userModel&quot; /&gt;

	&lt;view:LoginView id=&quot;view&quot; /&gt;

&lt;/mx:Application&gt;
</pre>
<ul>
<li>Nous continuons à utiliser le “<strong>creationComplete</strong>” pour déclencher la fonction<strong> init()</strong> qui chargera le fichier de configuration.</li>
<li>Il ne faut pas oublier d’inclure au besoin les classes contenues dans notre fichier de config !
<pre class="brush: js">
include &quot;includeService.as&quot;
</pre>
</li>
<li>Dans la fonction<strong> init()</strong>, nous ajoutons un écouteur sur <strong>ApplicationContext</strong> (<a href="http://www.lafabrick.com/labz/reflex/apidoc/com/lafabrick/reflex/ioc/event/ContextEvent.html#CONTEXT_LOADED">ContextEvent.CONTEXT_LOADED</a>), qui déclenchera la fonction <strong>onLoaded</strong> quand le fichier de configuration sera chargé. Puis nous lançons le chargement du fichier de config (<strong> ioc/application-config.xml</strong> ).</li>
<li>&#8230; Et nous incluons la vue LoginView.</li>
</ul>
<h3><strong>Modification de notre UserController</strong></h3>
<p>Dans un soucis de clarté, nous allons créer 2 classes contenants les constantes référençants les noms des services (contenus dans le fichier de configuration), et les noms des méthodes de ces services.</p>
<p>MethodConstant (dans notre exemple uniquement la méthode login)</p>
<pre class="brush: js">
package service
{
	public class MethodConstant
	{
		public static const LOGIN:String = &quot;login&quot;;
	}
}
</pre>
<p>ServiceConstant (les identifiants des objets contenus dans le fichier de configuration)</p>
<pre class="brush: js">
package service
{
	public class ServiceConstant
	{
		public static const SERVICE_USER:String = &quot;remotingUser&quot;;
		public static const SERVICE_OTHER:String = &quot;remotingOther&quot;;
	}
}
</pre>
<p>Nous venons de charger notre fichier de configuration au niveau de notre Application. Nous devons maintenant modifier notre contrôleur pour qu&#8217;il <strong>écoute le chargement du fichier</strong> (événement ContextEvent.CONTEXT_LOADED), et <strong>mette à jour sa propriété service</strong>.</p>
<pre class="brush: js">
package controller
{
	import com.lafabrick.reflex.controller.BaseController;
	import com.lafabrick.reflex.ioc.ApplicationContext;
	import com.lafabrick.reflex.ioc.event.ContextEvent;
	import com.lafabrick.reflex.model.ModelLocator;
	import com.lafabrick.reflex.service.ServicesLocator;

	import dataObject.UserDo;

	import model.UserModel;

	import mx.rpc.events.FaultEvent;
	import mx.rpc.events.ResultEvent;

	import service.MethodConstant;
	import service.ServiceConstant;

	public class UserController extends BaseController
	{

		public function UserController() : void
		{
			ApplicationContext.addEventListener(ContextEvent.CONTEXT_LOADED, onLoaded);
		}

		private function onLoaded( event:ContextEvent ) :void
		{
			// Contexte chargé
			this.service = ServicesLocator.getService( ServiceConstant.SERVICE_USER );
		}

		public function login( log:String, pass:String ) : void
		{
			executeMethod(MethodConstant.LOGIN, onLoginResult, onLoginFault, log, pass);
		}

		public function onLoginResult( event:ResultEvent ) : void
		{
			(ModelLocator.getModel( UserModel ) as UserModel).userLogged =
				event.result as UserDo;

			trace((ModelLocator.getModel( UserModel ) as UserModel).userLogged.name);
		}
		public function onLoginFault( event:FaultEvent ) : void
		{
			trace(&quot;resultat pourri ...&quot;+event.fault);
		}

	}
}
</pre>
<p><strong><a href="http://www.lafabrick.com/labz/reflex/tuto/reflexTuto2.zip">Les sources de cette exemple</a></strong></p>
<p>Et voilà ! Je vais préparer d&#8217;autres articles, notemment l&#8217;intégration de Reflex dans un projet Gumbo/Flex4. N&#8217;hésitez pas à poster vos retours, c&#8217;est en flexant qu&#8217;on devient flexeron.Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/10/03/256-titre/" rel="bookmark" title="3 octobre 2007">Utiliser Cairngorm dans un projet Flex / AMFPHP</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/06/06/327-google-language-api-flex/" rel="bookmark" title="6 juin 2008">Google AJAX Language API&#8230; et ton Flex devient polyglotte !</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/01/13/786-reflex-1-une-micro-architecture-pour-flex-simple/" rel="bookmark" title="13 janvier 2009">Reflex #1: une micro-architecture pour Flex&#8230; simple !</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/07/14/1920-flex-4-layouts-viewstack-pure-spark/" rel="bookmark" title="14 juillet 2010">Flex 4 et les layouts &#8211; Faire une ViewStack &laquo;&nbsp;pure&nbsp;&raquo; Spark</a></li>
</ul>
<p><!-- Similar Posts took 12.937 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2009/01/15/819-reflex-2-vous-reprendez-bien-un-peu-de-ioc/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Reflex #1: une micro-architecture pour Flex&#8230; simple !</title>
		<link>http://www.lafabrick.com/blog/2009/01/13/786-reflex-1-une-micro-architecture-pour-flex-simple/</link>
		<comments>http://www.lafabrick.com/blog/2009/01/13/786-reflex-1-une-micro-architecture-pour-flex-simple/#comments</comments>
		<pubDate>Mon, 12 Jan 2009 23:05:01 +0000</pubDate>
		<dc:creator>Fabien</dc:creator>
				<category><![CDATA[La Fabrick]]></category>
		<category><![CDATA[Nos projets]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Tutoriels]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=786</guid>
		<description><![CDATA[Après un temps de test, de mise en place et re-factorisation en tout genre, j’ai décidé de partager la petite micro-architecture que j’ai mis en place à l’université, et que j’utilise dans mes projets. Let&#8217;s gamble ! Encore un MVC ? Oui. Plus sérieusement, l’écriture de cette micro-architecture est partie d’un besoin de simplicité et [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.lafabrick.com/labz/reflex/images/reflexImgTuto1.jpg" alt="reflex image tut 1" title="reflex image tut 1" width="520" height="220" class="aligncenter size-full wp-image-915" /><br />
Après un temps de test, de mise en place et re-factorisation en tout genre, j’ai décidé de partager la petite micro-architecture que j’ai mis en place à l’université, et que j’utilise dans mes projets.</p>
<p><strong>Let&#8217;s gamble !</strong><br />
<span id="more-786"></span></p>
<h3><strong>Encore un MVC ?</strong></h3>
<p>Oui.<br />
Plus sérieusement, l’écriture de cette micro-architecture est partie d’un besoin de simplicité et de robustesse.</p>
<p>Souvent dans le monde de Flex, les équipes ne sont pas forcement homogènes. Certains sont habitués à la rigueur de Java, d’autres sont plus “devsigners freestyle” venant du monde Flash. Les premiers aiment les grosses mécaniques comme <a href="http://puremvc.org/">PureMVC</a>, ou <a href="http://www.pranaframework.org/">Prana Framework</a> “Spring like”. Les seconds connaissent au mieux <a href="http://opensource.adobe.com/wiki/display/cairngorm/Cairngorm">Cairngorm</a>, au pire confondent <a href="http://en.wikipedia.org/wiki/Model-view-controller">MVC</a> et <a href="http://fr.wikipedia.org/wiki/Ventilation_m%C3%A9canique_contr%C3%B4l%C3%A9e">VMC</a> &#8211; ce qui n’a rien a voir, sauf si vous faites une application riche sur le thème de la ventilation.<br />
Il fallait donc trouver la solution la plus efficace pour avoir un flux de production  le plus optimal.</p>
<p>Bon vous me direz “ba Cairngorm c’est pas mal” ! Oui mais voilà. Cairngorm est plus une ligne de conduite qu’une micro-architecture. Il suffit en gros de suivre les interfaces et d’écrire son MVC. C’est simple, mais pourquoi diable utiliser ces #?~! d’événements synchrones pour déclencher des commandes ! Et il devient assez pénible de dupliquer le travail déjà fait côté serveur&#8230; sans compter le temps de compilation à rallonge. C’est rigolo pour se faire les dents, mais au bout d’un moment faut être sérieux.</p>
<p>Donc Reflex.</p>
<h3><strong>Le MVC en 2 mots</strong></h3>
<p>MVC, pour Model View Controller, est le design pattern le plus connu. Le but de ce pattern est de décomposer la représentation graphique (la vue), la couche métier et le modèle de données.</p>
<p>Le modèle MVC de Reflex peut se visualiser comme suit :</p>
<p><img src="http://www.lafabrick.com/labz/reflex/images/MVCReflex.png" alt="MVC architecture" /></p>
<ul>
<li>La vue demande au contrôleur la récupération de données.</li>
<li>Le contrôleur lance la méthode avec les arguments associés, et capte les retours du serveur.</li>
<li>À la réception des données, le contrôleur met à jour le modèle de données.</li>
<li>Le modèle notifie à la vue son changement et la met à jour.</li>
</ul>
<h3><strong>Préparation de votre projet d’exemple</strong></h3>
<p><b><a href="http://www.lafabrick.com/blog/reflex/">Une page de ressources pour Reflex</a> est disponible sur le Blog.</b></p>
<p>Commencez par récupérer <a href=" http://www.lafabrick.com/labz/reflex/bin/reflex.swc">le swc reflex</a>.<br />
<a href="http://www.lafabrick.com/labz/reflex/source/reflex-src.zip">Les sources</a>, et <a href="http://www.lafabrick.com/labz/reflex/apidoc/">la documentation</a> sont aussi disponibles en lignes. </p>
<p>Pour cette exemple, nous allons utiliser un petit service Java. Je vous laisse <a href="http://www.lafabrick.com/labz/reflex/tuto/reflexTuto1.zip">télécharger le projet d’exemple “reflexTuto1”</a>, et regarder :</p>
<ul>
<li>le répertoire “java” : les sources Java ( UserDo : l’object de donnée, UserDs : la couche métier ).</li>
<li>Les fichiers de configuration dans le répertoire <strong>WebContent/WEB-INF/flex/remoting-config.xml</strong> : la configuration des services distants.</li>
</ul>
<p>Pour cette exemple vous aurez besoin d&#8217;un environnement Flex avec les WTP installés ainsi qu&#8217;un serveur Tomcat (pour lancer les exemples).</p>
<p>Petit rappel : </p>
<ul>
<li>
<strong>Pour installer les WPT</strong> ( qui vous donne accès à la perspective J2EE et à la vue server) :</p>
<ul>
<li>Ouvrez le menu <strong>Help > Software updates > Find and install…</strong></li>
<li>Faites “<strong>Search new features to install</strong>”</li>
<li>Dans la fenêtre qui apparaît, cochez “<strong>Europa Discovery Site</strong>”</li>
<li>Cliquez sur “<strong>Finish</strong>”</li>
<li>La recherche de plugins commence. Vous devrez choisir votre miroir. La fenêtre de résultats s’affiche. Déployez “<strong>Europa Update Site</strong>” et cochez “<strong>Web and J2EE Development</strong>”</li>
<li>Cliquez sur le bouton “<strong>Select Required</strong>”</li>
<li>Faites “<strong>Next</strong>”</li>
<li>Cochez <strong>“I accept…</strong>”</li>
<li>Faites “<strong>Next</strong>” de nouveau</li>
<li>Faites “<strong>Finish</strong>”</li>
</ul>
</li>
<li>
<strong>Pour installer un serveur TOMCAT</strong></p>
<ul>
<li>Téléchargez un <a href="http://apache.cict.fr/tomcat/tomcat-6/v6.0.18/bin/apache-tomcat-6.0.18.zip">Tomcat 6</a></li>
<li>Décompressez l&#8217;archive dans le répertoire de votre choix</li>
<li>Vous devez configurer votre serveur dans Flex à partir de la vue Server : &laquo;&nbsp;<strong>Windows > Other View&#8230;</strong>&nbsp;&raquo; puis &laquo;&nbsp;<strong>Servers</strong>&laquo;&nbsp;</li>
<li>Un fois configuré (clic droit dans la vue servers et &laquo;&nbsp;<strong>New&#8230;</strong>&laquo;&nbsp;), n&#8217;oubliez pas d&#8217;ajouter votre projet sur votre serveur ! (clic droit dans la vue servers et &laquo;&nbsp;<strong>Add and remove projects&#8230;</strong>&laquo;&nbsp;)</li>
</ul>
</li>
</ul>
<h3><strong>Au départ : un service et un objet de données</strong></h3>
<p>Tout d’abord nous devons représenter l’objet de données du serveur dans votre projet.</p>
<p>L’objectif est d’avoir une image identique des données côté serveur et côté Flex, afin que les 2 parties “parlent la même langue” : cette classe contient une référence vers son “image” côté serveur.</p>
<pre class="brush: js">
package dataObject
{

	[Bindable]
	[RemoteClass(alias=&quot;User.UserDo&quot;)]
	public class UserDo
	{
		public function UserDo()
		{
		}

		public var login:String;
		public var name:String;

	}
}
</pre>
<p>Nous voulons discuter avec la couche server : nous allons donc utiliser un service de type <strong><a href="http://livedocs.adobe.com/flex/3/langref/mx/rpc/remoting/mxml/RemoteObject.html">RemoteObject</a></strong>, faisant référence à notre couche serveur, défini dans le fichier <strong>remoting-config.xml</strong>.</p>
<pre class="brush: xml">
&lt;mx:RemoteObject
	id=&quot;remoteUser&quot;
	destination=&quot;javaFacadeUser&quot;
	showBusyCursor=&quot;true&quot; /&gt;;
</pre>
<h3><strong>Le Modèle</strong></h3>
<p>Le modèle est notre réceptacle de données.<br />
Cette classe étend <a href="http://www.lafabrick.com/labz/reflex/apidoc/com/lafabrick/reflex/model/BaseModel.html">BaseModel</a>, qui permet l’enregistrement automatique du modèle dans le <a href="http://www.lafabrick.com/labz/reflex/apidoc/com/lafabrick/reflex/model/ModelLocator.html">ModelLocator</a>.<br />
C’est lui qui sera mis à jour par le <strong>contrôleur</strong>, et qui, via le tag <strong>[Bindable]</strong>, mettra a jour là vue. Dans notre exemple nous allons stocker le UserDo, résultant de la requête serveur login().</p>
<pre class="brush: js">
package model
{
	import com.lafabrick.reflex.model.BaseModel;

	import dataObject.UserDo;

	public class UserModel extends BaseModel
	{
		[Bindable]
		public var userLogged:UserDo;

	}
}
</pre>
<h3><strong>Le Contrôleur</strong></h3>
<p>C’est l’intelligence du système. C’est lui qui invoque le service, récupère et met à jour les données.</p>
<pre class="brush: js">
package controller
{
	import com.lafabrick.reflex.controller.BaseController;
	import com.lafabrick.reflex.model.ModelLocator;

	import dataObject.UserDo;

	import model.UserModel;

	import mx.rpc.events.FaultEvent;
	import mx.rpc.events.ResultEvent;

	public class UserController extends BaseController
	{

		public function login( log:String, pass:String ) : void
		{
			executeMethod( &quot;login&quot;, onLoginResult, onLoginFault, log, pass);
		}

		public function onLoginResult( event:ResultEvent ) : void
		{
			(ModelLocator.getModel( UserModel ) as UserModel).userLogged =
				event.result as UserDo;
		}

		public function onLoginFault( event:FaultEvent ) : void
		{
			trace(&quot;Bad result ...&quot;+event.fault);
		}
	}
}
</pre>
<ul>
<li>Cette classe étend <a href="http://www.lafabrick.com/labz/reflex/apidoc/com/lafabrick/reflex/controller/BaseController.html">BaseController</a>, qui permet l’enregistrement automatique du contrôleur dans le <a href="http://www.lafabrick.com/labz/reflex/apidoc/com/lafabrick/reflex/controller/ControllerLocator.html">ControllerLocator</a>.</li>
<li> La méthode <strong>login()</strong> contient la mécanique de déclenchement du <strong>service</strong> (méthode de BaseController). La méthode <strong>executeMethod</strong> est définie par les propriétés suivantes :
<ul>
<li><strong><em>method:String</em></strong> : le nom de la méthode ( “login” ),</li>
<li><strong><em>resultFunction:Function</em></strong> : la fonction déclenchée lorsque le serveur renvoie un résultat (onLoginResult)</li>
<li><strong><em>faultFunction:Function = null</em></strong> : la fonction déclenchée lorsque le serveur renvoie une faute (onLoginFault)</li>
<li><strong><em>&#8230; args</em></strong> : tous les arguments à passer à la méthode distante&#8230;</li>
</ul>
</li>
<li>Le modèle est mis à jour dans le fonction de résultat. Pour récupérer l’instance du modèle, il suffit d’utiliser le <a href="http://www.lafabrick.com/labz/reflex/apidoc/com/lafabrick/reflex/model/ModelLocator.html">ModelLocator</a> :
<pre class="brush: xml">
// Renvoie l&#039;instance UserModel enregistré dans ModelLocator
trace( ( ModelLocator.getModel( UserModel ) as UserModel ) );
</pre>
</li>
</ul>
<p><span style="color: #800000;"><br />
<b>NOTE</b> : les “locator” <b>ModelLocator</b> et <b>ControllerLocator</b> n’enregistrent qu’une et une seul instance d’un même modèle / contrôleur. Si deux instances d’un même modèle / contrôleur sont déclarées, une erreur <a href="http://www.lafabrick.com/labz/reflex/apidoc/com/lafabrick/reflex/ReflexError.html">ReflexError</a> est levée. Les classes étendant <b>BaseController</b> et <b>BaseModel</b> sont automatiquement référencées dans <b>ModelLocator</b> et <b>ControllerLocator</b>.<br />
</span></p>
<h3><strong>La Vue</strong></h3>
<p>Construisons maintenant notre vue.</p>
<pre class="brush: xml">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;&gt;
&lt;mx:Application
	xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot;
	layout=&quot;absolute&quot;
	xmlns:controller=&quot;controller.*&quot;
	xmlns:model=&quot;model.*&quot;&gt;

&lt;mx:RemoteObject
	id=&quot;remoteUser&quot;;
	destination=&quot;javaFacadeUser&quot;;
	showBusyCursor=&quot;true&quot; /&gt;

	&lt;controller:UserController id=&quot;userControl&quot; service=&quot;{remoteUser}&quot; /&gt;

	&lt;model:UserModel id=&quot;userModel&quot; /&gt;

	&lt;mx:VBox&gt;
		&lt;mx:TextInput id=&quot;login&quot; /&gt;
		&lt;mx:TextInput id=&quot;password&quot; displayAsPassword=&quot;true&quot; /&gt;

		&lt;mx:Button label=&quot;connect&quot;
			click=&quot;{userControl.login( login.text, password.text )}&quot; /&gt;

		&lt;mx:Label x=&quot;208&quot; y=&quot;44&quot;
			text=&quot;User Name : {userModel.userLogged.name}&quot;/&gt;;
	&lt;/mx:VBox&gt;

&lt;/mx:Application&gt;
</pre>
<ul>
<li>Nous créons une instance RemoteObject permettant de pointer sur le service côté serveur. La propriété <em>destination</em> est l’identifiant du service dans le fichier <strong>remoting-config.xml</strong>.</li>
<li>Nous créons une instance de <b>UserController</b>, avec comme propriété <em>service</em> l’identifiant du RemoteObject “<strong>remoteUser</strong>”.</li>
<li>De la même manière, nous créons l’instance du modèle UserModel.</li>
<li>Au final, la vue appel la méthode <strong>login()</strong> du contrôleur, qui se charge d’envoyer et de réceptionner les données au serveur. Au retour, le contrôleur met à jour le modèle, en “poussant” le UserDo provenant du serveur. La vue est automatiquement mise à jour via le principe de Binding des données.</li>
</ul>
<p><b><a href="http://www.lafabrick.com/labz/reflex/tuto/reflexTuto1.zip">Les sources de cette exemple</a></b></p>
<h3><strong>Conclusion</strong></h3>
<p>Reflex n’a pas la prétention de concurrencer des architectures reconnues comme <a href="http://puremvc.org/">PureMVC</a> ou <a href="http://mate.asfusion.com/">MATE</a>. L’objectif, vous l’aurez compris, est d’aller à l’essentiel, sans se perdre dans la forêt des Design Pattern,  pour une productivité la plus efficace possible. A vous d’implémenter cette architecture selon vos besoins.</p>
<p>Le prochain tutoriel ira un peu plus loin dans cette micro-architecture : comment mieux découper son projet, et comment associer un fichier de configuration XML externe (<a href="http://www.lafabrick.com/labz/reflex/apidoc/com/lafabrick/reflex/ioc/package-detail.html">package IOC</a>).</p>
<p>J’attends vos retours !Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/10/03/256-titre/" rel="bookmark" title="3 octobre 2007">Utiliser Cairngorm dans un projet Flex / AMFPHP</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/06/06/327-google-language-api-flex/" rel="bookmark" title="6 juin 2008">Google AJAX Language API&#8230; et ton Flex devient polyglotte !</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/01/15/819-reflex-2-vous-reprendez-bien-un-peu-de-ioc/" rel="bookmark" title="15 janvier 2009">Reflex #2 : vous reprendrez bien un peu de IOC ?</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/07/14/1920-flex-4-layouts-viewstack-pure-spark/" rel="bookmark" title="14 juillet 2010">Flex 4 et les layouts &#8211; Faire une ViewStack &laquo;&nbsp;pure&nbsp;&raquo; Spark</a></li>
</ul>
<p><!-- Similar Posts took 21.078 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2009/01/13/786-reflex-1-une-micro-architecture-pour-flex-simple/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

