Contributed by Josh McDonald
SmartyPants-IOC is a dependency injection framework for use in building Adobe Flex and Flash applications inspired by Google Guice for Java. It's based on key concepts:
The class+name key
Injector requests, usually specified via metadata
Injector rules, specified using an ActionScript-based DSL
Whether you're telling SmartyPants-IOC what to provide or sitting around with your hand out asking for a dependency, the key is the same: a combination of a class and a name. You must specify the class, but the name is optional.
How do you actually request that a field be injected? In most circumstances you need to annotate your fields with ActionScript metadata. If you want to request an instance of IServiceInterface
, the syntax is simple:
[Inject] public var myService:IServiceInterface;
Let's say you want to look up a particular string, rather than just anything. For a Web Services Description Language (WSDL) URL, or something along those lines, use this syntax:
[Inject(name="mainWSDL")] public var myServiceWSDL:String;
These fields will be injected into your object when it's constructed for you by SmartyPants-IOC or when you call injector.injectInto(myInstance)
.
SmartyPants-IOC also supports live injections, which when coupled with live rules behave like the Flex SDK's data-binding functionality:
//This will be set whenever the source changes [Inject(name="userName",live)] public var currentUsername:String;
The injector rules are akin to Guice's bindings, but we use another term to avoid confusion with the Flex SDK's data-binding mechanism. You tell the injector what you'd like it to do, using the DSL. Here are a couple of examples:
//Simple singleton rules: injector.newRule().whenAskedFor(String).named("wsdl") .useInstance("http://www.server.com/soap/service.wsdl"); injector.newRule().whenAskedFor(IServiceInterface) .useSingletonOf(MyServiceImpl); injector.newRule().whenAskedFor(MyConcreteClass).useSingleton(); //"Live" rules act just like <mx:Binding> injector.newRule().whenAskedFor(String) .named("userId") .useBindableProperty(this, "userId");
Good question! Two ways. First, in an MXML component, this code will inject into your component on the CreationComplete
event:
<?xml version="1.0" encoding="utf-8"?> <mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:smartypants="http://smartypants.expantra.net/2008"> <smartypants:RequestInjection/> <!-- ...Regular code and MXML... --> </mx:Canvas>
And in ActionScript it's even simpler:
SmartyPants.injectInto(this);
Hopefully this gives a little more insight into the style and ideas behind SmartyPants-IOC. Be sure to check it out on the Google Code site!
SmartyPants-IOC is hosted on Google Code: http://code.google.com/p/smartypants-ioc/
.
18.226.163.167