示例

injector = [otherInjector withModule:[[Level18Module alloc] init]] 
                          withoutModuleOfType:[Level17Module class]];

指标工厂

3个目的足以经过对象工厂来从注射器上下文来得到对象.

自定义JSObjectFactory属性,需求运用 objection_requires 宏来指明注重,如
objection_requires(@”objectFactory”)
.那样当从注射器中收获那一个类的实例时,会活动拿到与此注射器相关的JSObjectFactory对象工厂实例.

特点

  • “Annotation” 基于依靠注入.
  • 无缝帮忙自定义集成和依赖扩大.
  • 自定义绑定时类的创办格局.
  • 元类绑定.
  • 合计绑定.
  • 实例对象绑定.
  • 小名绑定.
  • 懒加载.
  • 赶紧总计的单例.
  • 自定义伊始化方式.
  • 自定义参数和暗许值.

系统供给

  • MacOS X 10.8 +
  • iOS 7.0 +

示例

@implementation Car
objection_requires_sel(@selector(engine), @selector(brakes))
@synthesize engine, brakes, awake;
@end

示例

@implementation Car
//...
objection_register_singleton(Car)
  - (void)awakeFromObjection {
    self.awake = YES;
  }
@end  

外号绑定

同八个类或协议的依靠可以利用 objection_requires_names
宏标记,那么些宏使用属性小名字典作为参数.

Example

@implementation MyAppModule
- (void)configure {
  [self registerEagerSingleton:[Car class]];
}

@end

测试

借使您正在选取 Kiwi
来展开应用的测试,
请检出MSSpec.它提供了一种把虚拟数据注入到你的测试标准中的便利方式.

从Objection中创设的对象.

借使二个对象须求理解它使十二分被objection完全起头化的,能够兑现方式awakeFromObjection
.注意:对象被Objection完全初步化时会调用awakeFromObjection方法,你在那里能够投入自定义的局地操作;而awake只是三个例证中的自定义标记属性而已,并不是Objection的一部分.

示例

@interface CarProvider : NSObject <JSObjectionProvider>
@end

@implementation CarProvider
- (id)provide:(JSObjectionInjector *)context arguments:(NSArray *)arguments {
  // 手动创建对象的代码
  return car;
}
@end

@implementation MyAppModule
- (void)configure {
    [self bindProvider:[[CarProvider alloc] init] toClass:[Car class]];
    [self bindBlock:^(JSObjectionInjector *context) {
      // 手动创建对象.
      return car;          
    } toClass:[Car class]];
}
@end

实例和切磋的绑定

  • 绑定叁个说道或类到该类型钦定的某部实例.
  • 绑定3个一度注册到Objection的类到3个体协会议.

使用 Objection

私下认可参数示例

@implementation ViewController
objection_initializer(initWithNibName:bundle:, @"ViewController")
@end

使用CocoaPods安装

留意podfile中须求指明Objection的版本号,不然不能安装成功.

pod 'Objection', '1.6.1' # 依赖注入.

接下来在急需的地点导入即可头文件即可:

#import <Objection/Objection.h>

示例

@interface RequestDispatcher
@property(nonatomic, strong) JSObjectFactory *objectFactory
@end

@implementation RequestDispatcher
objection_requires(@"objectFactory") 

- (void)dispatch:(NSDictionary *)params
{
  Request *request = [self.objectFactory getObject:[Request class]];
  request.params = params;
  [request send];
}
@end

从一个早已存在的注射器派生2个新的注射器

二个新的注射器可以选择 withModule:
方法从2个早已存在的注射器成立.这一个新的注射器将会和派生它的注射器拥有同等的绑定音讯.

与之相反,借使利用
withoutModuleOfType:,新注射器就不会蕴藏被标记为不含有的模块.

使用选取器定义重视.

您也足以选用选用器来定义信赖.要是给定的选用器在脚下功效域看不见或不可能找到,编译器会生出3个警告.

初始化

暗许地,Objection 使用暗中同意的初步化方法 init
创立对象.若是您想选用别的的初阶化方法来早先化对象,能够依靠
objection_initializer
宏.这几个宏帮衬传递暗中同意参数(一时不协助标量参数,即着力项目参数,如数字).

基础用法

1个类能够动用宏 objection_register(可选)或
objection_register_singleton 注册到 objection. objection_requires
宏用来注解objection应该为此类的有着实例提供的正视.objection_requires在类的接续类别中也能够安全使用.

  • objection_requires
    宏,仅在从从注射器中拿走类的实例时,才有意义.从注射器中取得类实例的章程,上面会实际探究.
  • objection_requires
    宏证明重视后,使用注射器来收获此类实例时,会自行创造依赖类的实例,并赋值给响应的属性.
  • 假若采纳 objection_register_singleton
    宏注册八个类,并锲而不舍采纳注射器来取得此类的实例,那此类就无须本人达成单例机制了.

依靠注入

有只怕类的实例对象并不是经过注射器创设的,此时倘若不做特别处理,注重不会被正确处理,相关属性可能为nil.但是假若对于使用
objection_requires宏钦赐依赖的动静,你能够通过injectDependencies:主意来达成:就算不选拔注射器也能确认保证重视被满意.

@implementation JSTableModel
objection_requires(@"RESTClient")
- (void)awakeFromNib {
  [[JSObjection defaultInjector] injectDependencies:self];
}
@end

简介

Objection 是3个轻量级的Objective-C重视注入框架,可同时用于MacOS X
或然iOS.对于那多少个使用过Guice(贰个Java重视注入框架)的开发者,会感觉到Objection
似曾相识.Objection用来以一种冲突不难接受的不二法门来使你尽量地不必要管理三个硕大的XML容器或然手动制造对象.

作用域

一个类被当做模块功用域内的单例.相反,多个已经注册的单例在也得以被降职为注射器上下文中3个平日注明周期的实例对象.

也正是说,你有二种方式来钦命类实例在注射器上下文是单例对象照旧普通对象.一种是在类完毕中应用
objection_register_singleton
宏,一种是在模块配置方式中钦赐作用域为JSObjectionScopeSingleton.

示例

@interface MyAppModule : JSObjectionModule {

}
@end

@implementation MyAppModule
- (void)configure {
  [self bind:[UIApplication sharedApplication] toClass:[UIApplication class]];
  [self bind:[UIApplication sharedApplication].delegate toProtocol:@protocol(UIApplicationDelegate)];
  [self bindClass:[MyAPIService class] toProtocol:@protocol(APIService)];
}

@end
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
  JSObjectionInjector *injector = [JSObjection createInjector:[[MyAppModule alloc] init]];
  [JSObjection setDefaultInjector:injector];
}

及早起首化的单例

您能够将已经登记的单例用作及早开端化的单例.及早初阶化的单例,在注射器成立时创建,而不再是懒加载.

专注:借使将多个未注册为单例的类设置为尽快伊始化的单例,会引起崩溃.

示例

@protocol ExternalUtility
  - (void)doSomething;  //!< 注意此处,确实是`-`减号.通常是不支持让元类直接支持协议的.此处是以类本身作为对象,来取执行协议,而不是使用该类的某一个实例.
@end

@interface ExternalUtility
  + (void)doSomething;
@end

@implementation ExternalUtility
  + (void)doSomething {...}
@end

// Module Configuration
- (void)configure {
  [self bindMetaClass:[ExternalUtility class] toProtocol:@protocol(ExternalUtility)];    
}

@interface SomeClass
{
  ...
}
//  使用 'assign' 是因为一个元类不受通常的 retain/release声明周期限制.
// 它将会一直存在,直到应用程序终止(类初始化 -> 应用终止),不管运行时有多少指向它的对象引用.
// 
@property (nonatomic, assign) id<ExternalUtility> externalUtility
@end

元类的绑定

突发性,大家只有是想行使正视的有个别类的类方法.Objection可以因而商业事务呈现地支撑元类的绑定.那样就绝不再次创下造3个封装类来传递类方法.要专注的是,它要求定义叁个商讨来让Objection知道哪些绑定元类到注射器的靶子上下文.

提供者

奇迹你或者想要在Objection内部手动构造3个对象.提供者允许你选拔自定义的建制来创立有些项指标对象.你能够创制二个
遵守 ObjectionProvider 磋商的目的,可能你能够选用2个 block
来创立对象.

借使选拔了对像提供者,则原类中的
-awakeFromObjection方法在此类的实例通过注射器创设完结后,不会再被调用.

下标操作

Objection 已经支持使用下标操作来从注射器上下文来获取对象.

- (void)someMethod {
  JSObjectionInjector *injector = [JSObjection createInjector];
  id car = injector[[Car class]];
}

自定义参数示例

@implementation ConfigurableCar
objection_requires(@"engine", @"brakes")
objection_initializer(initWithMake:model:)

@synthesize make;
@synthesize model;

- (instancetype)initWithMake:(NSString *)make model:(NSString *)model {
  ...
}
@end

- (void)buildCar {
  ConfigurableCar *car = [self.objectFactory getObjectWithArgs:[ConfigurableCar class], @"VW", @"Passat", nil];
  NSLog(@"Make: %@ Model: %@", car.make, car.model);
}

专用初阶化方法

@implementation ConfigurableCar
- (instancetype) initWithModel:(NSString *)model {
    //....
}
@end

- (void)buildCar {
  ConfigurableCar *car = [self.objectFactory getObject:[ConfigurableCar class], 
                                           initializer: @selector(initWithModel:) 
                                           withArgumentList:@[@"Passat"]];
}

从Objection中赢得对象.

能够创建1个注射器,然后从那一个注射器中得到钦点类或协议的二个实例.注射器各自管理自个儿的靶子上下文.这意味:Objection中的单例指的是二个注射器中只设有2个某部类的实例,并不一定是真正意义上的单例(即那种应用程序全局唯一的类的实例对象).

- (void)someMethod {
  JSObjectionInjector *injector = [JSObjection createInjector];
  id car = [injector getObject:[Car class]];
}

三个给Objection设置一个暗中同意的注射器.这些设置器能够在您的采纳或库内,全局可用.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
  JSObjectionInjector *injector = [JSObjection createInjector];
  [JSObjection setDefaultInjector:injector];
}

- (void)viewDidLoad {
  id myModel = [[JSObjection defaultInjector] getObject:[MyModel class]];
}

示例.

@class Engine, Brakes;

@interface Car : NSObject

// 将会通过依赖注入赋值.
@property(nonatomic, strong) Engine *engine;
// 将会通过依赖注入赋值.
@property(nonatomic, strong) Brakes *brakes;
@property(nonatomic) BOOL awake;

@implementation Car
objection_requires(@"engine", @"brakes")
@synthesize engine, brakes, awake;
@end

示例

@interface ShinyCar : NSObject
@property (nonatomic, strong) Headlight *leftHeadlight;
@property (nonatomic, strong) Headlight *rightHeadlight;
@end

@implementation ShinyCar
objection_register(ShinyCar)
objection_requires_names((@{@"LeftHeadlight":@"leftHeadlight", @"RightHeadlight":@"rightHeadlight"}))
@synthesize leftHeadlight, rightHeadlight;
@end

@implementation NamedModule

- (void)configure
{
    [self bind:[[Headlight alloc]init] toClass:[Headlight class] named:@"RightHeadlight"];
    [self bindClass:[HIDHeadlight class] toClass:[Headlight class] named:@"LeftHeadlight"];

}
@end

类措施初叶化

@implementation Truck
objection_requires(@"engine", @"brakes")
objection_initializer(truckWithMake:model:)
+ (instancetype)truckWithMake:(NSString *) make model: (NSString *)model {
  ...
}
@end

模块

三个模块正是一组绑定新闻.这几个绑定消息用来给注射器扩大额外的布置音信.它在组合外部信赖和绑定协议到类或实例时专门有用.

示例

@implementation MyAppModule
- (void)configure {
    [self bindClass:[Singleton class] inScope:JSObjectionScopeNormal];
    [self bindClass:[Car class] inScope:JSObjectionScopeSingleton];
}
@end

相关文章

网站地图xml地图