riacon swiz
DESCRIPTION
Presentation on getting started with the Swiz framework for Adobe Flex. It concentrates on solving problems around IoC, dependency injection, event handling and interacting with external services.TRANSCRIPT
![Page 1: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/1.jpg)
1
Introduction to Swiz
It’s easy. Seriously. No, I mean it. It is.
Nicholas Tunney
![Page 2: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/2.jpg)
2
Session Goals
• What problems are we trying to solve?• How do I set up Swiz?• How do I put Swiz to work for me?• Where else can I learn about Swiz?
![Page 3: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/3.jpg)
3
WHAT PROBLEMS ARE WE TRYING TO SOLVE?
![Page 4: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/4.jpg)
4
Inversion of Control
• Decentralize application control• Provide for actions on setup and teardown• Separate the WHAT from the WHEN
![Page 5: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/5.jpg)
5
Inversion of Control
DANGER!
Cour
tesy
of J
oam
Tal
l (Fl
ickr
)
![Page 6: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/6.jpg)
6
Dependency Injection
• Objects are dependent on other objects• Objects need those objects to be created
(instantiated) to perform a task• Objects that handle their own object creation
are said to be ‘tightly coupled’• A simple change to the program results in
major code changes, just not flexible• Problem is best illustrated with an example
![Page 7: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/7.jpg)
7
Dependency Injection
public class Boat {private var engine:Engine = new Merc230();
public function boat () {}
cruise (int RPM):String {engine.go(RPM);return engine.thrillFactor;
}}
![Page 8: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/8.jpg)
8
Dependency Injection
public class Boat {private var _engine:Engine;
public function boat () {}
set Engine (engine:Engine):void {_engine = engine;}
cruise (int RPM):String {_engine.go(RPM);return _engine.thrillFactor;}
}
![Page 9: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/9.jpg)
9
Dependency Injection
myBoat:IBoat = new Boat();myEngine:IEngine = new Merc230();myBoat.setEngine(myEngine);myBoat.go(3000) // ‘w00t!’myNewEngine:IEngine = new Merc57();myBoat.go(3000) // ‘YEEEHHHHHAAAA!!!’
![Page 10: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/10.jpg)
10
Dependency Injection
• Can see how powerful dependency injection can be
• Can do that in various places across files (still lots of code to change, or via configuration using a framework like Swiz (one file to change)
![Page 11: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/11.jpg)
11
Singletons
• Create once, use everywhere• Low overhead, single instantiation
• Swiz is used to create these objects, and handle keeping state across the application
![Page 12: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/12.jpg)
12
Creation of Transient Objects
• Swiz permits Prototyping objects• Acts like an object factory• Ask Swiz for an object, it injects dependencies
and hands you a single instance of that object• Not persistent
![Page 13: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/13.jpg)
13
Event Handling
• We react to events in the application and perform tasks (WHAT versus WHEN)
• Event handling in Flex can be a nightmare challenge• Events need to be dispatched from non-display objects to
varied display objects• Events need to be dispatched from display objects to non-
display objects like controllers or their presentation models• I want to fire an event ANYWHERE in my Flex application,
and mediate it ANYWHERE in my Flex application
![Page 14: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/14.jpg)
14
Interaction with External Services
• Every Flex app I have written (except 1) has interacted with external services, it’s the way of the web anymore
• Each external service call has a set signature and workflow
• Writing this workflow for every call is tedious, or moreover redundant
![Page 15: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/15.jpg)
15
HOW DO I SET UP SWIZ?
![Page 16: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/16.jpg)
16
Grab the SWC
• http://www.swizframework.org• Place correct swc in /lib directory
![Page 17: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/17.jpg)
17
SwizConfig
• Brutally simple, just like the framework• Can simply copy/paste• A few knobs to turn
![Page 18: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/18.jpg)
18
SwizConfig
<swiz:config> <swiz:SwizConfig setUpEventType="{ Event.ADDED_TO_STAGE }" setUpEventPhase="{ EventPhase.CAPTURING_PHASE }" setUpEventPriority="50" tearDownEventType="{ Event.REMOVED_FROM_STAGE }" tearDownEventPhase="{ EventPhase.CAPTURING_PHASE }" tearDownEventPriority="50" eventPackages="com.foo.event.*, org.bar.event.*" viewPackages="com.foo.view.*, org.bar.view.*" defaultFaultHandler="handleUnhandledFaults" defaultDispatcher="global" /> </swiz:config>
![Page 19: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/19.jpg)
19
SwizConfig
<swiz:config> <swiz:SwizConfig eventPackages="com.foo.event.*, org.bar.event.*" viewPackages="com.foo.view.*, org.bar.view.*” /> </swiz:config>
![Page 20: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/20.jpg)
20
Logging Target
• I do not write perfect code, I need to log – a lot• Built in logging for Swiz to console• Can override and customize by extending the
AbstractSwizLoggingTarget class
<swiz:loggingTargets> <swiz:SwizTraceTarget id="myTraceTarget" /> </swiz:loggingTargets>
![Page 21: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/21.jpg)
21
Stuff We Didn’t Do
• Verbose configuration• Force the usage of J2EE patterns• Have to define any special directory structure• Tightly couple Swiz to our code (except with
ServiceHelper and command chain) – no extending framework classes, etc)
• Take more than 5 minutes to review the Quickstart ;)
![Page 22: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/22.jpg)
22
HOW DO I PUT SWIZ TO WORK FOR ME?
![Page 23: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/23.jpg)
23
Review of Problems We Are Solving
• Inversion of Control• Dependency Injection• Singletons• Creation of Transient Objects (Factory)• Event Handling• Interaction with External Services
![Page 24: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/24.jpg)
24
Inversion of Control
• Permits us to define and declare dependencies:– Controllers – for server interaction– Model– Delegates– Services
![Page 25: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/25.jpg)
25
Dependency Injection
• IoC container is defined by BeanProviders– Define non-view classes– Once defined, they can all be injected into your UI,
presentation model, controllers, etc• Can define in main application file, best
practice to define and include <- but Swiz doesn’t try to force you to do this ;) - Use the <swiz:Bean /> tag
![Page 26: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/26.jpg)
26
Dependency Injection
• Beans.mxml – or whatever you call it<swiz:BeanProvider xmlns:swiz=" xmlns:service="org.swizframework.quickswiz.service.*" xmlns:controller="org.swizframework.quickswiz.controller.*"> <service:UserService id="userService"/> <controller:UserController id="userController"/> <!-- We'll use the Swiz ServiceHelper to help simulate a server-side call. --> <swiz:ServiceHelper id="serviceHelper" /> </swiz:BeanProvider>
![Page 27: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/27.jpg)
27
Dependency Injection
• So how do we inject these objects? METADATA!(Note that Swiz can inject into public properties only)
– Inject by type (preferred)[Inject]variableName:Type
– Inject by name[Inject (“myService”)]variableName:RemoteObject;
![Page 28: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/28.jpg)
28
Dependency Injection
Can also inject a bean property[Inject (“ApplicationConfig.mode”)]currMode:String;
Or provide a destination[Inject ( source=“ApplicationConfig.mode”,
destination=“presentationModel.mode” ) ]
![Page 29: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/29.jpg)
29
Dependency Injection
Setter Injection is also possible
[Inject]public function setModel (model:UserModel):void {
…}
![Page 30: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/30.jpg)
30
Singletons
• All objects created in the beans.mxml as described are officially singletons
• This statement is not true for prototype objects
BEAN LIFECYCLE
![Page 31: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/31.jpg)
31
Bean LifeCycle
• [PostConstruct]• [PreDestroy]
Type Step
Flex Removed event
Flex Removed from stage event
Swiz [PreDestroy] processed
Swiz [Inject] tear down
Swiz [EventHandler] tear down
Swiz [Dispatcher] tear down
Swiz Default custom metadata tear down
Swiz [ViewRemoved] processed
![Page 32: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/32.jpg)
32
Creation of Transient Objects
• New object created for each request• Much like an object factory• Can send in properties via configuration as
well<swiz:Prototype id=”User" type="{ User }" constructorArguments="{ someOtherBean }" />
![Page 33: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/33.jpg)
33
Event Handling
• Event mediation – decouples the WHAT from the WHEN– Code the WHAT– Wire the WHEN
![Page 34: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/34.jpg)
34
Event Handling
• Two things we care about– Dispatching events– Mediating events
![Page 35: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/35.jpg)
35
Event Handling
• Dispatching Events– From a UIComponent• dispatchEvent()
– important! The event must bubble!– Swiz listens in the root container
– From other objects• Inject a dispatcher
– [Dispatcher]– Variable should have a type of IEventDispatcher– Swiz handles the dependency injection
![Page 36: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/36.jpg)
36
Event Handling
• Mediating Events– Sooooooo easy!– This was my aha moment for using a Flex
framework
![Page 37: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/37.jpg)
37
Event Handling
• Simple Event Mediation– We can do this since we defined event packages– Otherwise, specify fully qualified classname
[EventHandler( event=“EventClass.EVENT_CONSTANT” )] public function myEventHandler (event:Event): void { … }
![Page 38: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/38.jpg)
38
Event Handling
Swiz inspects the handler and reacts accordingly(note there is no event property in this method)
[EventHandler( event=“EventClass.EVENT_CONSTANT” )] public function myEventHandler (): void { … }
![Page 39: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/39.jpg)
39
Event Handling
Grab properties from the event(note that we can now explicitly call this method outside of an event)
[EventHandler( event=“MyEvent.EVENT”, properties=“user” )] public function myEventHandler (user:User): void { … }
![Page 40: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/40.jpg)
40
Event Handling
Mediate multiple events with the same handler
[EventHandler( event=“MyEvent.EVENT”] [EventHandler( event=“MyEvent.OTHER_EVENT”] public function myEventHandler (): void { … }
![Page 41: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/41.jpg)
41
Interaction with External Services
• Swiz provides beans for Async and other services– Async: ServiceHelper– Non Async: URLRequestHelper
![Page 42: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/42.jpg)
42
Interaction with External Services
• ServiceHelper– Define the bean– Inject the bean– Call the service– Handle the results
![Page 43: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/43.jpg)
43
Interaction with External Services
Define the ServiceHelper bean<swiz:ServiceHelper id="serviceHelper" />
Inject the bean[Inject]
public var sh:ServiceHelper;
Call the servicesh.executeServiceCall(ro.method(), resultHandler, faultHandler);
![Page 44: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/44.jpg)
44
Demo
Demonstrates everything we have talked about today, plus supports the Cat Internet meme.
![Page 45: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/45.jpg)
45
Bonus: Client Persistence
SharedObject - Provides methods for storing items
<swiz:BeanProvider xmlns:swiz=" xmlns:storage="org.swizframework.storage.*”> <storage:SharedObjectBean id="soBean" /></swiz:BeanProvider>
![Page 46: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/46.jpg)
46
Bonus: Client Persistence
Using the SharedObject bean
[Inject]public var so:ISharedObjectBean; [Bindable]public function get appIndex():int{ // the second parameter is the initial value return so.getInt("appIndex", 0);} public function set appIndex(index:int):void{ so.setInt("appIndex", index);}
![Page 47: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/47.jpg)
47
WHERE ELSE CAN I LEARN ABOUT SWIZ?
![Page 48: Riacon swiz](https://reader033.vdocuments.us/reader033/viewer/2022061206/54829798b079591a0c8b47fc/html5/thumbnails/48.jpg)
48
Continued Learning
• http://swizframework.org– Starting point for everything– Wiki – everything in this preso is on the wiki
• Quickstart• Configuration• FAQ• Everything else
– @swizframework– Google Group –
groups.google.com/group/swiz-framework