<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Flex Frameworks</title>

<link rel="shortcut icon" href="images/garland_favicon.gif" type="image/x-icon" />
<style>
body,li,td,h1,h2,h3,p,th,a {
	font-family: Sans, Arial, Times;
	font-size: 90%;
}
</style>
</head>


<body bgcolor="#ffffff">
	<div class="container">
        <div class="subpageArticle">
        	<h1>Using an external framework (microarchitecture) in your Flex Development		  </h1>
       	  <h3>Why use a Framework?</h3>
       	  <p>The choice to use a framework is an often highly (and hotly) debated topic. There are numerous external frameworks or 'microarchitectures' currently available that have been developed and should be considered. Since Flex itself is a framework, the term microarchitecture might help clear up some confusion to those new to the subject. Some of the benefits derived from using a microarchitecture during application development are:</p>
				<ul>
				  <li>Decoupling</li>
			      <li>Abstraction </li>
				  <li>Code reuse</li>
				  <li>Organization</li>
				  <li>Consistency </li>
				  <li>Extensibility</li>
				  <li>Standardization</li>
				  <li>Ease of testing</li>
				  <li>Flexibility</li>
				  <li>Reduction of error</li>
   		  </ul>
<h3>Popular External Framework Choices (in no particular order)</h3>
<ul>
  <li>Cairngorm - based on Model-View-Controller pattern</li>
  <li>Mate - tag-based, event-driven (message-bus) framework with Dependency Injection </li>
  <li>Parsley - based on Inversion of Control (IoC) and Dependency Injection</li>
  <li>PureMVC - based on Model-View-Controller pattern</li>
  <li>RobotLegs - based on Inversion of Control (IoC) and Dependency Injection</li>
  <li>Swiz - based on Inversion of Control (IoC) and Dependency Injection </li>
</ul>
<p>More information can be found under each framework item  listed in Tour de Flex.</p>
<h3>Related Reading</h3>
<p>Check out these links for more related reading on using these frameworks:</p>
<ul>
		<li><a href="http://www.adobe.com/devnet/flex/articles/flex_framework.html">Adobe Devnet Article on Flex Frameworks</a></li>
		<li><a href="http://www.insideria.com/2009/10/max-2009-session-videos.html">InsideRIA Max 2009 Video on Flex Frameworks</a></li>
		<li><a href="http://joelhooks.com/2009/07/12/inversion-of-control-and-dependency-injection-in-flex-using-the-parsley-application-framework-part-1/">Joel Hooks post IoC and Dependency Injection using Parsley</a>
		<li><a href="http://www.insideria.com/2009/08/how-i-learned-to-stop-worrying.html">InsideRIA article by Greg Owen about using Flex Frameworks </a></li>
		<li><a href="http://www.summa-tech.com/blog/2009/02/27/the-flex-application-frameworks-smackdown-sorta/">Flex Framework Comparison by Via Bulatao</a></li>
		<li><a href="http://coenraets.org/blog/2009/07/building-a-flex-application-with-the-parsley-framework/">Building an app with Parsley by Christophe Coenraets</a></li>
		<li><a href="http://www.insideria.com/2008/12/frameworkquest-2008-introducti.html">InsideRIA Framework Quest</a></li>
		<li><a href="http://www.anandvardhan.com/2008/11/13/popular-flex-frameworks/">Popular Flex Frameworks post by Anand Vardhan</a></li>      
</ul>
        </div>
        <div class="copyright"> </div>
        
    </div>
<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
try {
var pageTracker = _gat._getTracker("UA-519419-3");
pageTracker._trackPageview();
} catch(err) {}</script>
</body>
</html>

