RVContainer 1.0.11

RVContainer 1.0.11

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布最新发布2020年8月

Jordi Puigdellivol 维护。



  • Jordi Puigdellívol

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,请随时提交。