10. Flex’s DI Container
Flex’s DI Container
PranaFramework
http://www.pranaframework.org/
SmartyPants IOC
http://code.google.com/p/smartypants‐ioc/
swizframework
http://code.google.com/p/swizframework/
Japanese container(coming soon)
Flex3勉強会第73回@北陸 2009‐07‐04
43. SmartyPants IOC
create Injector & lookup dependency
private var _injector:Injector;
private function onCreationComplete():void
{
// setup injector
_injector = SmartyPants.getOrCreateInjectorFor(this);
}
private function sample():void
{
var bean1:SingletonClass = _injector.newRequest(this)
.forClass(SingletonClass).getInstance();
var bean2:SingletonClass = _injector.newRequest(this)
.forClass(SingletonClass).getInstance();
}
Flex3勉強会第73回@北陸 2009‐07‐04
44. SmartyPants IOC
inject
[Inject]メタデータタグで指定
Guiceの@Inject
GuiceのModule=getInjectorに渡すinstace
[Inject]
public class InjectTest
Flex3勉強会第73回@北陸 2009‐07‐04
45. SmartyPants IOC
Class Binding
newRule().whenAskedFor
useClass
named(“xx”).useClass
useSingletonOf
// interfaceの実装をCalcAddに
_injector.newRule().whenAskedFor(ICalc).useClass(CalcAdd);
// “calc”という名前でBinding
_injector.newRule().whenAskedFor(ICalc).named("calc").useClass(CalcAdd);
// singleton
_injector.newRule().whenAskedFor(ICalc).useSingletonOf(CalcAdd);
Flex3勉強会第73回@北陸 2009‐07‐04
46. SmartyPants IOC
Class Binding Tips1
namedでclass bindingしたinterfaceは,
getInstanceの際にbindしたnamed指定で取得
しないとエラー。
// namedで”foo”指定でbind
_injector.newRule().whenAskedFor(ICalc).named("foo").useClass(CalcAdd);
// bindした名前と異なるのでエラー
var calc:ICalc =
_injector.newRequest(this).forClass(ICalc).named(“abc").getInstance();
// 名前を指定しないとエラー
var calc:ICalc =
_injector.newRequest(this).forClass(ICalc).getInstance();
// 正しくgetInstance可能
_injector.newRequest(this).forClass(ICalc).named("foo").getInstance();
Flex3勉強会第73回@北陸 2009‐07‐04
47. SmartyPants IOC
Class Binding Tips2
同⼀interfaceで複数実装classを登録した場合,
後の登録が有効
登録してもエラーにはならない
// 同⼀interfaceでnamed指定無しで複数登録
_injector.newRule().whenAskedFor(ICalc).useClass(CalcAdd);
_injector.newRule().whenAskedFor(ICalc).useClass(CalcMinus);
// getInstance => CalcMinus
var calc:ICalc =
_injector.newRequest(this).forClass(ICalc).getInstance();
Flex3勉強会第73回@北陸 2009‐07‐04
49. SmartyPants IOC
scope
prototype(default)
getInstance毎にinstance⽣成
singleton
何度getInstanceしても同じinstance
[Singleton]メタデータタグで指定
[Singleton]
public class SingletonClass
Flex3勉強会第73回@北陸 2009‐07‐04
61. swizframework
load config and lookup dependency
private function sample():void
{
// load config
Swiz.loadBeans([Beans]);
// getBean
var bean1:Sample1 =
Swiz.getBean("sample1") as Sample1;
}
Flex3勉強会第73回@北陸 2009‐07‐04
62. swizframework
inject
[Autowire]メタデータタグで指定
同⼀interfaceで複数登録時は,id指定
[Autowire]
public class InjectTest
[Autowire(bean=“calcAdd”)]
public var _calc:ICalc;
Flex3勉強会第73回@北陸 2009‐07‐04