OBInjector 1.4.0

OBInjector 1.4.0

测试已测试
语言 Obj-CObjective C
许可证 BSD
发布最新发布2016 年 5 月

René Pirringer 维护。



OBInjector 是Objective-C的一个非常小且简单的依赖注入器,它执行属性注入。

用法

请参阅示例项目的详细信息。

包括到您的项目中

要在项目中使用 OBInjector,最简单的方法是使用 CocoaPods

将以下行添加到您的 Podspec 中

pod 'OBInjector', '~> 1.4.0'

在您的代码中使用以下导入

#import <OBInjector/OBInjector.h>

设置注入器

现在将 OBInjector 实例添加到您的 AppDelegate。


@implementation AppDelegate {
}


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [OBInjectorController configureInjector:^(OBPropertyInjector *injector) {
        MyService *myService = [[MyService alloc] init];
        [injector registerProperty:@"myService" withInstance:myService];
    }];
}

使用注入器

现在注入器已经准备就绪,我们想要将 MyService 实例注入我们的 ViewController。为此,我们需要在 ViewController 类中指定该属性

@property(nonatomic, strong) MyService *myService;

如果此属性在公共头文件中或在一个私有类别中无关紧要。

最后一件事是告诉注入器应将依赖项注入 ViewController。这个模式的规则是:一个实例的创建者总是负责触发注入器。在这种情况下,ViewController 是根视图控制器,因此 AppDelegate 负责触发注入,所以我们添加以下代码到 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 方法

[OBInjectorController injectDependenciesTo:self.window.rootViewController]; 

如果 ViewController 现在创建另一个视图控制器,或者故事板中有 segues 显示子视图控制器,那么 ViewController 现在负责触发到新视图控制器的新注入。

为了使它简单,有一个 NSObject 的类别有助于这里

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    [OBInjectorController injectDependenciesTo:segue.destinationViewController];
}

它是如何工作的

当注入器被触发以给定的类注入属性时,检查给定类中的所有属性是否匹配已注册的属性。匹配意味着属性名必须等于已注册的属性名,并且属性的类型也必须匹配。

注入器被这样配置

[OBInjectorController configureInjector:^(OBPropertyInjector *injector) {
        MyService *myService = [[MyService alloc] init];
        [injector registerProperty:@“myService” withInstance:myService];
    }];

确保 configureInjector 只被调用一次。

现在您需要一个类,该类有一个名为 'myService' 的属性,类型为 'MyService',以便可以注入实例

[OBInjectorController injectDependenciesTo:myInstance]

@property(nonatomic, strong) MyService *myService;

这不起作用

@property(nonatomic, strong) MyService *service;

子类

注入的属性的类型不能是完全相同的类。它可以是一个子类。

MyExtendedService *myService = [[MyExtendedService alloc] init]; // is subclass of MyService
[injector registerProperty:@"myService" withInstance:MyExtendedService]; 

协议

同样,也可以为注入注册协议。

@protocol FooService <NSObject>
...
@end
@interface FooServiceImpl : NSObject <FooService>
...
@end
FooServiceImpl *fooService = [[FooServiceImpl alloc] init];
[injector registerProperty:@"fooService" withInstance:fooService]; 

如果您现在指定以下属性,FooServiceImpl 将会进行注入。

@protocol (nonatomic, strong) NSObject<FooService> fooService;

只有当属性为nil时才会注入属性

viewController.myService = [[MySpecialService alloc] init];
[injector injectDependenciesTo:viewController];

这里属性myServices没有改变!!!

如何知道属性已注入。

如果您的类实现了协议 OBInjectorDelegate 和方法 - (void)didInjectDependencies;,则在注入完成后会调用此方法,但只有当进行了注入时才会调用。

您可以使用此方法在需要注入依赖项时完成实例的初始化。

我希望始终注入一个新的实例

为此,您可以注册一个属性,该属性调用一个可以创建实例的块。

[injector registerProperty:@"currentDate" withBlock:^{
    return [NSDate date];
}];

如果您现在有一个属性 @property(nonatomic, strong) NSDate *currentDate;,则在属性注入时将始终设置新的NSDate实例。

API 文档

在这里您可以找到由 AppleDoc 生成的 API 文档。

http://openbakery.org/documentation/OBInjector/index.html

构建和测试

要构建项目,请运行 './gradlew xcodebuild',要运行单元测试,请运行 './gradlew test'。您需要安装 Java。