460 likes | 735 Views
Developing Flex Applications with the Swiz Framework. Chris Scott. www.cfunited.com. About Me. Enterprise Software Consultant Author of the Swiz Framework Co-Author of ColdSpring Contributor to too many OSS projects Developing with Flex, CF and Java for quite a long time. www.cfunited.com.
E N D
Developing Flex Applications with the Swiz Framework • Chris Scott www.cfunited.com
About Me • Enterprise Software Consultant • Author of the Swiz Framework • Co-Author of ColdSpring • Contributor to too many OSS projects • Developing with Flex, CF and Java for quite a long time www.cfunited.com
What We’ll Cover • What, Why, How • What is Swiz? • Why should you use it? • How does Swiz make your life easier? • Why do I have such a hangover? • Advanced Swiz • New Features www.cfunited.com
Another framework for Flex? www.cfunited.com
What Swiz users are saying... • “Broadchoice evaluated a few frameworks and settled on Swiz as the keystone behind our Workspace product.” • Sean Corfield, CTO Railo US www.cfunited.com
What Swiz users are saying... • “Personally I think it is way better then Cairngorm!” • Kurt Wiersma, some Mach-ii dude www.cfunited.com
What Swiz users are saying... • “Swiz is a lovely, lightweight framework that I'm really enjoying working with.” • Aral Balkan, a popular Flash blogger and CF hater www.cfunited.com
What Swiz users are saying... • “Even bigger thanks for Swiz... Which is one of the most elegant and useful pieces of software that I've ever seen in my 24 years of programming!” • Afik Gal, a guy I do not know at all www.cfunited.com
Why Swiz? • Because those guys told you to? • Not at all!! But Swiz is... • Simple and effective! • Easy to learn! • Designed to help you write less code! • Encourages loose coupling through MVC! • More things that end with !!!... www.cfunited.com
What is Swiz all about? www.cfunited.com
Swiz Overview • Flex Applications Require: • Remote Services • Models / Data • Controllers / Logic • Views www.cfunited.com
Swiz Overview • Components need each other • Wire ourselves • Use Locators • Verbose XML www.cfunited.com
Swiz Overview • Components need each other • Wire ourselves • Use Locators • Verbose XML • IoC • Annotations www.cfunited.com
Swiz Overview • Views communicate with components • Flex Events • MVC Paradigm • DynamicMediatormakes it easy! www.cfunited.com
Swiz Overview • Applications need remote data • Async Tokens • Responders • State around calls • DynamicRespondermakes it easy! www.cfunited.com
Major Swiz Features • IoC • autowires app • DynamicResponder • remote data • DynamicMediator • event handling • and a whole lot more... www.cfunited.com
What Swiz DOESN’T Provide • Excessive JEE patterns • Boilerplate code • Verbose XML / MXML configuration • Overly Prescriptive workflow www.cfunited.com
Inversion of Control, the Swiz way How about a little audience participation... www.cfunited.com
IoC Recap • Components require ‘dependencies’ to function • Dependencies may be simple strings and values, or other components • Resolving complex dependencies is outside the scope of primary logic www.cfunited.com
Inversion of Control with Swiz • Express dependencies through Metadata, or ‘Annotations’ • Swiz takes care of configuration through Dependency Injection • Views also have dependencies such as Models, or PresentationModels • Swiz handles everything for you! www.cfunited.com
Working with Swiz www.cfunited.com
Defining Beans • Define components in BeanLoaders • Written in plain old MXML • Swiz calls objects Beans because it only cares about their properties* • * only sort of true… www.cfunited.com
Defining BeanLoaders • <BeanLoader xmlns=“org.swizframework.util.*” • xmlns:mx=http://www.adobe.com/2006/mxml> • <mx:RemoteObject id=“userService” destination=“userService”/> • <mx:RemoteObject id=“mapService” destination=“mapService”/> • <controller:UserController id=“userController”/> • <controller:MapController id=“mapController”/> • </BeanLoader> www.cfunited.com
Swiz’s IoC Factory • When Swiz loads beans, it searches for ‘Autowire’ metadata • When objects are retrieved, Swiz performs the magic of Autowiring • Swiz adds event listeners for added to stage and removed from stage events • Allows Swiz to Autowire and clean up Views too! www.cfunited.com
Loading Swiz - Old Style... • Load Swiz early, in a preinitialize handler • Swiz constructs components for you to help manage your application • Initialization is performed as soon as you do anything to Swiz, like loading beansprivate function onInitialize() : void { Swiz.loadBeans( [ Beans ] );} www.cfunited.com
Loading Swiz - New Style! • Use Swiz’s ConfigBean in MXML • Requires an array of BeanLoaders • Access to all configuration parameters<swizframework:SwizConfig strict="true" beanLoaders="{[Beans]}" logEventLevel="{LogEventLevel.WARN}"/> www.cfunited.com
Expressing Dependencies • Dependencies are NOT defined in MXML! • Use [Autowire] in your AS objects • Similar to new Spring 2.0 configuration • Qualify bean to inject by id. • [Autowire(bean="userController")]public var userController: UserController; www.cfunited.com
Expressing Dependencies • To autowire by type, forget the ‘bean’ • Swiz looks for bean which matches the variable type • Works with interfaces and inheritance • Swiz throws ‘AmbiguousBean’ error if more than one bean could be injected www.cfunited.com
View Autowiring • You can use Autowire on accessors as well as properties • Properties can be autowired with two way bindings!! • Accessors allow views to perform logic when dependencies are set • don’t do this in Beans! Only in views! • there are better ways to perform initialization! www.cfunited.com
Working with Remote Services • Swiz provides two simple methods for remote method calls • Both dynamically create responders for AsyncTokens • DynamicResponder • DynamicCommand www.cfunited.com
Working with Remote Services • DynamicResponders bind result and fault handlers transparently • DynamicCommand is similar, but can be chained together and delayed • Swiz offers simple methods for creating in AbstractController www.cfunited.com
DynamicResponders • executeServiceCall creates dynamic responders for you • Implement iResponderexecuteServiceCall(userService.getUser, getUserResult); • First parameter an AsyncToken, returned from a remote call • Second parameter is the Function to be called in the responder’s onResult() www.cfunited.com
DynamicResponders • Third parameter is a Function to be called in the responder’s onFault() • If you omit the fault parameter, Swiz uses a default fault handler • Swiz can also bind extra parameters to your result handlers www.cfunited.com
Binding data to result handlers • Passed as an array to executeServiceCall • Swiz treats this as extra arguments to pass to your result handler • Allows you maintain state over async calls • ex. Pass User being saved to ResultHander www.cfunited.com
DynamicCommands • Similar to DynamicResponders, but first parameter is a Function which returns an AsyncToken • The Function is called dynamically in the Command’s execute() method • Created for you with createCommand()createCommand(userDelegate.saveUser, [user], saveUserResult); www.cfunited.com
DynamicCommands • Can be added to Swiz’s CommandChain • Chains can run in series or parallel • A final Function or Event is fired when the Chain completes • You can attach a Function or Event for faults as well www.cfunited.com
DynamicCommands • var chain : new CommandChain(); • chain.addCommand(createCommand( • helloDelegate.echo, ["swiz rulz!"], • echo_results, local_Fault)) • .addCommand(createCommand( helloDelegate.showTime, null, time_results, local_Fault)); • chain.completeHandler = completeHandler; • chain.proceed(); www.cfunited.com
Event Handling with Swiz • Swiz does not try to replace Flex’s Event model, just adds a little simplicity • Most apps contain a CentralDispatcher, Swiz just give you one for free • Swiz abstracts its use through static methods www.cfunited.com
Event Handling with Swiz • Swiz.dispatchEvent(event:Event); • Dispatches any event (no Swiz event) • Swiz.dispatch(type:String); • Creates an event for you • Swiz.addEventListener(type:String, function:Function, ... ); • Adds an eventListener to Swiz’s CentralDispatcher www.cfunited.com
DynamicMediators • Greatly help to promote loose coupling between Views and Controllers • Enables very simple event handling in Controllers • Reduces repetitive glue code in Views • Sort of similar to Cairngorm’s FrontController, but WAY less boilerplate code www.cfunited.com
DynamicMediators • Add [Mediate] annotation to a Controller function • [Mediate(event=“eventType”, properties=“foo, bar”)]public function doStuff(argA : String, argB : String) {} • Swiz creates a DynamicMediator for you • Adds an eventListener for supplied type to Swiz’s centralDispatcher • Uses ‘properties’ to construct method call www.cfunited.com
Strict type checking • No compile time checking of event type strings • Swiz.setStrict(true) forces Swiz to lookup event types from existing classes • Can define base event packages with addEventPackage • Swiz can write a proper missing event class to a log file www.cfunited.com
Recap • Swiz’s IoC is very easy to use • Swiz provides a simple MVC paradigm • Very little XML! Mostly Annotations • Swiz provides core utilities for: • DynamicResponders and Commands • Event handling • DynamicMediators www.cfunited.com
Recap • Swiz represents best practices learned from years of consulting • Swiz is damn easy! • New features are coming fast and furious! www.cfunited.com
Resources • Swiz Resources • http://code.google.com/p/swizframework • http://groups.google.com/group/swiz-framework • http://cdscott.blogspot.com • http://soenkerohde.com • http://www.returnundefined.com • Other Resources • http://code.google.com/p/dphibernate • http://code.google.com/p/flex-mojos • http://code.google.com/p/loom www.cfunited.com
Thank You! • Chris ScottEnterprise Software Consultant • http://cdscott.blogspot.comchris.scott.one@google.comasstrochris@comcast.netgtalk:chris.scott.one@gmail.comaim/skype/twitter/plurk/brightkite: asstrochris www.cfunited.com