Page Contents: Table of Contents |
---|
minLevelmaxLevel | 4 |
---|
maxLevelminLevel | 4 |
---|
|
Dependency Injection OverviewThe 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 typeIf 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 |
---|
|
[Inject]
public var model:IUserModel;
|
Tip |
---|
| 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 |
---|
title | Automatic 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 nameIf 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 |
---|
|
[Inject( source="userService" )]
public var service:RemoteObject;
...
// will inject this from BeanProvider
<mx:RemoteObject id="userService" />
|
Info |
---|
| "source" is the default attribute of [Inject], so the above tag could also be written as [Inject( "userService" )] |
Inject bean propertySwiz 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 |
---|
|
[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 |
---|
|
[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 |
---|
|
[Inject( source="userModel.currentUser.firstName" )]
public var firstName : String;
|
Two way bindingsTo 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 |
---|
|
[Bindable]
[Inject( source="userModel.currentUser", twoWay="true" )]
public var currentUser:User;
|
Setter injectionSwiz 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 |
---|
|
[Inject]
public function setModel( model:UserModel ):void
{
this.model = model;
}
|
Injection destinationSometimes 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 |
---|
|
[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. |
|