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;
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实例。
在这里您可以找到由 AppleDoc 生成的 API 文档。
http://openbakery.org/documentation/OBInjector/index.html
要构建项目,请运行 './gradlew xcodebuild',要运行单元测试,请运行 './gradlew test'。您需要安装 Java。