RVContainer
这是一个基于 Laravel 的简单轻量级 IoC 容器,适用于 Objective-c。
安装
pod 'RVContainer'
使用
有两种方法使用它,创建一个新的 RVContainer
实例并存储在一个可以访问到任意部分的地方,或者使用提供的单例。
使用单例时,有两种方法可以调用它
[RVContainer container]
或者简单地使用 IOC
宏,该宏缩短了上述调用。
IOC
为了将类绑定到容器,有几种方法
基本绑定
[IOC bind:AwesomeClass.class resolver:SubAwesomeClass.class];
[IOC bind:AwesomeClass.class closure: ^(id){
return [SubAwesomeClass new];
}];
您可以将一个实例绑定,这样容器在请求该类时总是会返回它。
SubAwesomeClass * instance = [SubAwesomeClass new];
[IOC instance:AwesomeClass.class object:instance];
类似于上一个功能,您还可以注册单例,当请求它时总是会返回相同的实例。
[IOC singleton:AwesomeClass.class closure:^id{
return [SubAwesomeClass new];
}];
另一个重要特性是绑定契约(或Objective-C中的协议)。
[IOC bindProtocol:@protocol(aProtocol) resolver:ClassThatImplementsTheProtocol.class];
解析
如果尝试解析容器中不存在类的实例,它会返回被请求类的新实例。
AwesomeClass * object = [IOC make:SubAwesomeClass.class];
ClassThatImplementsTheProtocol * object = [IOC makeProtocol:@protocol(aProtocol)];
自动注入
如果您不希望在类中充斥着容器解析函数,可以使用自动注入。它会自动将依赖注入到对象的属性中。
需要声明以下需要注入的属性
#import "RVAutoInject.h"
@interface ClassWithObjectsToBeInjected : NSObject
@property(strong,nonatomic) inject(AwesomeClass) *subtest;
@property(strong,nonatomic) TestClass *test;
@property(strong,nonatomic) injectProtocol(aProtocol) *testProtocol;
@end
然后在您的init方法中调用
[RVAutoInject autoInject:self];
我对这个自动注入调用不是很满意,但不知道如何自动执行
贡献
我非常欢迎任何问题和PR,请随时提交。