Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3
Section
Column
width15px

Column

Page Contents:

Table of Contents
minLevelmaxLevel4
maxLevelminLevel4

Dependency Injection Overview

The IoC Container of Swiz is the BeanProvider class. Any beans defined in a registered BeanProvider can be injected into other registered beans or into views added to the display list.

Defining an injection target is done using the [Inject] metadata tag. Common injection scenarios include the following:

  • Inject Model into View
  • Inject Model into Controller
  • Inject Delegate into Controller
  • Inject Service into Delegate
Note

Due to restrictions imposed by the AVM, Swiz cannot inject into private, protected or internal members.

Tip

By default, injections in view components happen during the ADDED_TO_STAGE event. This behavior can be modified by changing the Swiz configuration. It is important to understand that this means that injections occur after the CREATION_COMPLETE event. If you need to trigger logic during creation that depends on injections, use a [PostConstruct] method.


Inject by type

If you define exactly one bean of a given type you can inject it into a matching destination with a plain [Inject] tag. Note this also supports injecting a concrete implementation of an interface to which the destination is typed. In other words, if a property decorated with [Inject] is of type IUserService, Swiz will correctly inject a bean implementing that interface, such as UserService or MockUserService.

Code Block
as3
as3
[Inject]
public var model:IUserModel;


Tip
titleBest Practice

You should inject by type whenever possible. It avoids reliance on string based names, which can lead to run time errors caused by misspellings.

Tip
titleAutomatic Creation and Injection of Built-In Helper Classes

If Swiz encounters an [Inject] tag for a property typed to ServiceHelper, IServiceHelper, URLRequestHelper, IURLRequestHelper, or MockDelegateHelper, and there is no matching Bean defined in a BeanProvider, Swiz will automatically create a bean of the correct type and inject it for you.


Inject by name

If you have more than one bean of a given type defined you can request that a bean with a specific name be injected. This bean name must match the id attribute of the bean's tag as defined in your BeanProvider.

Code Block
as3
as3
[Inject( source="userService" )]
public var service:RemoteObject;

...

// will inject this from BeanProvider
<mx:RemoteObject id="userService" />


Info
titleQuick Tip

"source" is the default attribute of [Inject], so the above tag could also be written as [Inject( "userService" )]


Inject bean property

Swiz can also inject public bean properties, rather than just the beans themselves using dot notation. In the following example "userModel" is the name of a bean, and we are injecting its currentUser property.

Code Block
as3
as3
[Inject( source="userModel.currentUser" )]
public var currentUser : User;


If the bean property is bindable and the decorated property is public, you can have Swiz create a binding to the source property by adding bind="true" to the [Inject] tag:

Code Block
as3
as3
[Inject( source="userModel.currentUser", bind="true" )]
public var currentUser : User;


As of Swiz 1.3, you can also inject nested properties, such as:

Code Block
as3
as3
[Inject( source="userModel.currentUser.firstName" )]
public var firstName : String;


Two way bindings

To set up a reverse binding, so the bean property will receive updates made to the injection target, you can set the twoWay attribute of the [Inject] tag to true. This of course requires that the injection target is bindable as well.

Code Block
as3
as3
[Bindable]
[Inject( source="userModel.currentUser", twoWay="true" )]
public var currentUser:User;


Setter injection

Swiz can also inject values into single argument methods. All of the attributes and policies mentioned above apply to setter injection as well, with the exception of twoWay.

Code Block
as3
as3
[Inject]
public function setModel( model:UserModel ):void
{
    this.model = model;
}


Injection destination

Sometimes it's useful to define an injection someplace other than directly on a property/method. This is especially true in MXML views, where decorating a child component's property is not possible. Rather than creating a local variable and binding your component property to it, you can simply use the destination attribute of [Inject]. If this were defined in an MXML file, it would be wrapped in a Metadata tag.

Code Block
as3
as3
[Inject( source="userModel.currentMode", destination="modeViewStack.selectedIndex" )]


Note

Take care to ensure that the injection destination will be created and available by the time your injections are processed. The injection processing trigger can be configured in SwizConfig, but defaults to the ADDED_TO_STAGE event.

Column
width15%