注射器是一个针对Objective-C的超轻量级、简单易用的依赖注入框架。它主要受到Java世界类似工具的启发,例如Spring或Google Guice。
注射器的使用非常简单。您想要注入的类只需要实现一个空的协议即可。不需要任何配置;框架能自动发现所有可注入的对象,并创建实例缓存。请参阅下面的安装说明。
它有时被称为“好莱坞原则”的一种实现。好莱坞原则是以业余爱好者筛选失败后给予的回答命名的:“别打电话给我们,我们给你打电话”。但与好莱坞制片人相反,DI框架将信守承诺。想象一下Car类及其密切合作者Engine。在旧时代,你会创建一个类,例如,在Car的构造器中,就会创建一个Engine实例。这工作得很好,但在编程书中的例子中。通常你会有更多的合作者,很快你将需要为其他类提供同一个Engine实例。
这时恶魔开始微笑,在耳边低语:“亲爱的开发者,对类之间的连接网络感到麻烦吗?试试单例模式,你不必担心将已创建的实例传递给所有相关方”。直到最近,大多数Objective-C开发者还是听了单例恶魔的话。
注射器被设计得尽可能简单。它还没有(尚)像Spring那样强大和灵活,但它完成了基本的工作。Objective-C运行时非常强大,这允许魔法发生。
将以下单行添加到前缀头文件
#include "Syringe.h"
使用Injectable
协议注释您想注入的类,例如。
@interface Car : NSObject <Injectable> {
…
}
注射器做很多魔法,但必须从Syringe手动获取树形结构的第一个对象。您可以使用此简单宏进行操作。
Car *car = inject(Car);
这就是全部!如果存在引用其他Injectable
注释类的ivar,它们将被自动填充。
@interface Car : NSObject <Injectable> {
Engine *engine;
}
在上面的例子中,Engine 类遵从 Injectable 协议,其实例将在启动时创建并自动注入到 Car 中。
无需烦恼,无需配置。注射器采取了简化的方法,但适用于大多数情况。假设一旦类被标记为 "Injectable",在遇到匹配类型的 ivar 时,它将自动进行依赖注入。
整个子系统在首次调用 inject()
时初始化。它会扫描项目中所有的类,并急切地初始化遵从 Injectable
协议的类。
您可以在方便的时候手动启动 DI 容器
[BeanFactory bootstrap];
注射器不支持带参数的构造函数,只有裸分配/初始化对。为了进行额外的初始化,实现额外的协议 InitializingBean
@interface Car : NSObject <Injectable,InitializingBean>
-(void) afterPropertiesSet {
…
}
并实现必须的 afterPropertiesSet
方法。当对象实例创建时,并且其协作伙伴进行注入和初始化时,将调用此方法。
延迟初始化 - 正在进行中。
请随时联系我:tomek.cejner at gmail dot com