版权所有 © 2013, Jeremy Tregunna,保留所有权利。
JInjector 是一个 iOS 和 OS X 依赖注入库。它非常轻量级,可能不适合所有用途。它不如其他 IoC 库灵活,但这个对于我的需求来说恰到好处,YMMV。
此项目使用自动引用计数 (ARC),但不使用任何弱引用。因此,它可以安全地运行在 iOS 的最低部署目标上,这是现在 Xcode 最低给出的 4.3.3。它将在任何 4.x iOS 版本上都工作。这也适用于 OS X 10.7.0 及更高版本。
如何将此库添加到您构建设置中是您的业务。您可以使用 git 子模块,复制文件,什么都行。如果选择将我们的项目文件添加到您的工作区中, bạn chỉ cần依赖生成的库或框架产品,这样就足够了。
基本上,您最感兴趣的两件事是:将实例注入到您的类中,以及为他人提供预初始化的实例以便将其注入到他们的类中。
要获取一个类的实例,这非常简单
Car* car = JInject(Car);
您最有可能使用 JInject()
给某个属性一个实例,但这个实例将在注入器中共享。 JInject()
使用默认注入器,尽管您可以通过调用 [[JInjector alloc] init]
来创建其他注入器。实例在注入器之间不会缓存。
要为特定类设置默认值,您可以这样做
APIClient* client = [[APIClient alloc] initWithAccessToken:@"abcdef1234567890"];
[[JInjector defaultInjector] setObject:client forClass:[APIClient class]];
然后随后的调用查询实例将返回那个特定的实例,而不会创建一个新的实例。任何对 -[JInjector setObject:forClass:]
的调用都将替换注入器中缓存的任何先前实例。
有一件事情值得提一下,JInjectable
(您想要能够注入的对象必须遵从的协议)上有一个可选的协议方法,然后在 JInjector 需要为您的类创建新实例时会调用此方法。您可选择实现此方法,其签名如下
- (void)awakeFromInitialization;
您不能向此方法传递任何参数,这是我们的框架的限制。在这种可以传递参数的情况下,考虑查看上面的 APIClient
示例作为解决方案。
上述两种操作都支持类似现代 Objective-C 中数组和大字典的对象索引。它们的工作方式就像上面描述的那样,但您可以这样使用它们
JInjector* injector = [JInjector defaultInjector];
// Setting an object
injector[[APIClient class]] = [[APIClient alloc] initWithAccessToken:@"abcdef1234567890"];
// Getting an instance
APIClient* client = injector[[APIClient class]];
想要一个使用此库的综合性示例?查看单元测试,它们展示了所有情况。
本库的使用和分发条款可在LICENSE文件中找到。
如果您认为可以在代码、文档等方面提供帮助。请告知我。最好使用pull request并附上测试代码。有关我们的贡献协议,请参阅此文档。