元标签注入式MVC框架: InjectMVC
什么是依赖注入(Dependency Injection)?
依赖注入DI在我们编程中其实随处可见,你也可能正在用构造函数注入,setter注入,属性注入等。网上资料随处可以见,在此就不赘述。
什么是元标签(metadata)注入?
有过flex编程经验的可能都知道如[SWF]、[Bindable]、[Event]这样的元标签metadata,flex编译器会根据不同的metadata
会赋予swf特定的属性或者生成特定的as代码来达到我们的目的。 当我们加上-keep-as3-metadata+=MetaName这样编译参数后,编译器会把指定的metadata保存到编译的swf中去。当你再用describeType()方法获取某个有metadata标记的类的XML描述的时候,你会看到你定义的metadata。基于这样的原理,我们便可以利用这一特性实现特殊的注入。
什么是元标签注入式MVC框架?
这是本人根据这种框架的特性命名的。最典型的当属robotlegs (注:可参考eidiot翻译的robotlegs最佳实践)。本框架也是受了它很大的启发,当然InjectMVC有它自己的特点:可注入事件,框架更简单小巧等。(对robotlegs熟悉的朋友可以直接下载demo和源码了解InjectMVC的特别之处)
InjectMVC里Context的作用?
Context是InjectMVC的中枢,有点像puremvc里的Facade,它负责初始化和管理MVC的核心部分Model、View、Controller。 但它跟Facade不一样,它不是单例,可以被实例化。一般来说,一个context定义一个作用域。MVC成员Mediator、Proxy、Command在context范围内的相互通讯和协作。每个context对应一个显示对象application。
Context有一个非常重要的成员Injector,它负责映射和注入属性和事件给Mediator、 Proxy、Command。但你无需直接操作Injector,它已经被封装到context里,你要做的就是注册Mediator、Proxy、Command,并注入你所需要的属性和事件。Context还有一个contextDispatcher,它负责发送和响应context事件。
Context提供以下API供其MVC成员调用来完成彼此的通讯和协作:
* registerMediator
* getMediator
* removeMediator
* hasMediator
* registerProxy
* getProxy
* removeProxy
* hasProxy
* registerEvent
* removeEvent
* dispatchEvent
当你用上面的方法注册一个mediator,proxy或event的时候,InjectMVC会自动注入它们用[Inject]原标签定义的依赖,并保存它们的映射以供其他类注入使用。
比如,我们注册了这么一个mediator:
registerMediator(btn, ButtonMediator);
那么,我们在之的某个Command中便可以注入这个ButtonMediator:
package
{
public class CustomCommand extends Command
{
[Inject]
public var btnMediator:ButtonMediator;
override public function execute()
{
btnMediator.doSomeThing();
}
}
}
更多的文档请到这里参考wiki。
InjectMVC相关下载: