Hi,
I'm trying to configure Spring ActionScript manually (ie, without XML), but having some trouble getting existing instances into an ObjectFactory. More specifically, I'm trying to write an adapter so that I can use Spring with my current framework, and am struggling with the bindValue part. This is what I've got going so far. Any advice would be greatly appreciated.
Code:package net.boyblack.robotlegs.adapters { import net.boyblack.robotlegs.core.IInjector; import org.as3commons.reflect.ClassUtils; import org.as3commons.reflect.Field; import org.as3commons.reflect.MetaData; import org.as3commons.reflect.Type; import org.springextensions.actionscript.ioc.ObjectDefinition; import org.springextensions.actionscript.ioc.factory.support.DefaultListableObjectFactory; import org.springextensions.actionscript.utils.ObjectUtils; public class SpringInjector implements IInjector { protected var factory:DefaultListableObjectFactory; public function SpringInjector() { factory = new DefaultListableObjectFactory(); } public function bindValue( whenAskedFor:Class, useValue:Object, named:String = null ):void { var whenAskedForClassName:String = ClassUtils.getFullyQualifiedName( whenAskedFor ); var useClassName:String = ObjectUtils.getFullQualifiedClassName( useValue ); var objdef:ObjectDefinition = new ObjectDefinition( useClassName ); // how to store useValue instance? var key:String = named ? named : whenAskedForClassName; factory.registerObjectDefinition( key, objdef ); } public function bindClass( whenAskedFor:Class, instantiateClass:Class, named:String = null ):void { var whenAskedForClassName:String = ClassUtils.getFullyQualifiedName( whenAskedFor ); var useClassName:String = ClassUtils.getFullyQualifiedName( instantiateClass ); var objdef:ObjectDefinition = new ObjectDefinition( useClassName ); objdef.isSingleton = false; var key:String = named ? named : whenAskedForClassName; factory.registerObjectDefinition( key, objdef ); } public function bindSingleton( whenAskedFor:Class, named:String = null ):void { var whenAskedForClassName:String = ClassUtils.getFullyQualifiedName( whenAskedFor ); var objdef:ObjectDefinition = new ObjectDefinition( whenAskedForClassName ); var key:String = named ? named : whenAskedForClassName; factory.registerObjectDefinition( key, objdef ); } public function bindSingletonOf( whenAskedFor:Class, useSingletonOf:Class, named:String = null ):void { var whenAskedForClassName:String = ClassUtils.getFullyQualifiedName( whenAskedFor ); var useClassName:String = ClassUtils.getFullyQualifiedName( useSingletonOf ); var objdef:ObjectDefinition = new ObjectDefinition( useClassName ); var key:String = named ? named : whenAskedForClassName; factory.registerObjectDefinition( key, objdef ); } public function injectInto( target:Object ):void { var type:Type = Type.forInstance( target ); var fields:Array = type.fields; for each ( var field:Field in fields ) { if ( field.hasMetaData( 'Inject' ) ) { var named:String; var mds:Array = field.getMetaData( 'Inject' ); for each ( var md:MetaData in mds ) { if ( md.hasArgumentWithKey( 'name' ) ) { named = md.getArgument( 'name' ).value; } else if ( md.hasArgumentWithKey( 'id' ) ) { named = md.getArgument( 'id' ).value; } } named = named ? named : field.type.fullName; target[ field.name ] = factory.getObject( named ); } } } public function unbind( clazz:Class, named:String = null ):void { named = named ? named : ClassUtils.getFullyQualifiedName( clazz ); factory.removeObjectDefinition( named ); } } }


Reply With Quote
I'm trying to find out what the bindValue() method actually does though, is this when an instance's property needs to be injected by a managed value?