objection是一个轻量级的依赖注入框架,受Guice的启发,Google Wallet也是使用的该项目。「依赖注入」是面向对象编程的一种设计模式,用来减少代码之间的耦合度。通常基于接口来实现,也就是说不需要new一个对象,而是通过相关的控制器来获取对象。2013年最火的PHP框架laravel就是其中的典型。
假设有以下场景:ViewControllerA的view里有一个button,点击之后push到ViewControllerB,最简单的写法类似这样:
- (void)viewDidLoad { [super viewDidLoad]; UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem]; button.frame = CGRectMake(100, 100, 100, 30); [button setTitle:@"PUSH" forState:UIControlStateNormal]; [button addTarget:self action:@selector(buttonTapped) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button]; } - (void)buttonTapped { ViewControllerB *vc = [[ViewControllerB alloc] init]; [self.navigationController pushViewController:vc animated:YES]; }
这样写的一个问题是,ViewControllerA需要import ViewControllerB,也就是对ViewControllerB产生了依赖。依赖的东西越多,维护起来就越麻烦,也容易出现循环依赖的问题,而objection正好可以处理这些问题。
下面我们来看下使用objection如何实现上面的需求。
首先,定义一个协议(protocol),然后通过objection来注册这个协议对应的Class,需要的时候,可以获取该协议对应的object。对于使用方无需关心到底使用的是哪个Class,反正该有的方法、属性都有了(在协议中指定)。这样就去除了对某个特定Class的依赖。也就是通常所说的「面向接口编程」。
// 获取默认的injector,这个injector已经注册过BViewControllerProtocol了 JSObjectionInjector *injector = [JSObjection defaultInjector]; // 获取BViewControllerProtocol对应的Object UIViewController <BViewControllerProtocol> *vc = [injector getObject:@protocol(BViewControllerProtocol)]; // 拿到vc后,设置它的属性,因为在BViewControllerProtocol里有定义对应的属性,所以不会有warning vc.backgroundColor = [UIColor redColor]; vc.currentIndex = 1000; [self.navigationController pushViewController:vc animated:YES];
可以看到这里没有引用BViewController。
再来看看这个BViewControllerProtocol是如何注册到injector中的,这里涉及到了Module,对Protocol的注册都是在Module中完成的。Module只要继承JSObjectionModule这个Class即可。
@interface BViewControllerModule : JSObjectionModule @end @implementation BViewControllerModule - (void)configure { [self bindClass:[BViewController class] toProtocol:@protocol(BViewControllerProtocol)]; } @end
绑定操作是在configure方法里进行的,这个方法在被添加到injector里时会被自动触发。
// 获取默认的injector JSObjectionInjector *injector = [JSObjection defaultInjector]; // 如果默认的injector不存在,就新建一个 injector = injector ? : [JSObjection createInjector]; // 往这个injector里注册Module injector = [injector withModule:[[BViewControllerModule alloc] init]]; // 设置该injector为默认的injector [JSObjection setDefaultInjector:injector];
上面这段代码可以直接放到 + (void)load里执行,这样就可以避免在AppDelegate里import各种Module了。
因为我们无法直接获得对应的Class,所以必须要在协议里定义好对外暴露的方法和属性,然后该Class也要实现该协议。
@protocol BViewControllerProtocol <NSObject> @property (nonatomic) NSUInteger currentIndex; @property (nonatomic) UIColor *backgroundColor; @end @interface BViewController : UIViewController<BViewControllerProtocol> @end
通过objection实现依赖注入后,就能更好地实现SRP(Single Responsibility Principle),代码更简洁。
本文的demo示例下载:http://download.csdn.net/detail/jsntghf/8584513
相关推荐
objection修改计划-IOS新增功能篇
Android hook frida objection基本使用+ Wallbreaker
Objection是一个轻量级的依赖注入框架,附件提供了一个简单的示例,可以执行运行。
Python-objection运行时移动探索工具包
iOS一键重签名,轻松制作iOS上任意应用或游戏分身、以及Hook后重签名安装到非越狱或越狱设备等,以下是功能说明 1. 自动识别传入的文件为.app文件或.ipa文件,并进行不同的处理 2. 可指定重签名后ipa导出路径...
可以使用objection.js关系表达式来获取结果的关系。 在路线中使用异议查找非常简单: const findQuery = require ( 'objection-find' ) ;// Our objection.js model.const Person = require ( '../models/Person' )...
Android-objection.zip,反对-运行时移动探索,安卓系统是谷歌在2008年设计和制造的。操作系统主要写在爪哇,C和C 的核心组件。它是在linux内核之上构建的,具有安全性优势。
3.汇总和报告在模型上创建快速计数和总和可以大大加快开发速度。 一个示例可以是客户模型的numberOfOrders 。捷径安装npm i objection-filter --save objection-filter> = 1.0.0与旧查询完全向后兼容,但现在支持...
Objection.js - Node.js一个SQL友好的轻量级ORM
基于YOLO的实时车辆检测,python代码程序,完整的python车辆识别系统
反对软删除 使用您的Objection.js模型自动处理软删除。安装从npm安装: npm install objection-softdelete 使用异议实例注册插件: const objectionSoftDelete = require ( 'objection-softdelete' ) ;...
因为我总是在项目中花费相同的时间来创建相同的结构,所以我可以用它来提供更多很棒的功能:) 用法 这是一个全局程序包,应在项目的根目录下运行。 初始化 首先,运行: agile-model init 这将在项目根目录中创建一...
资源来自pypi官网。 资源全名:objection-1.0.2.tar.gz
安装NPM npm i objection-password 纱yarn add objection-password 版本兼容性节点版本插件版本<12> = 12 > = 3.x 如果您使用的是Node 12或更高版本,请使用插件的3.x版本,因为它包含bcrypt 5.x ,其中包含重要的...
【Frida】【Android】05_Objection实战 示例程序
bizhi, 使用 ReactiveCocoa2/MVVM/objection 创建壁纸应用程序 简介一个简单的壁纸应用演示了使用 ReactiveCocoa2,MVVM和反对屏幕截图 安装克隆到本地后,运行 pod install
在SQL 中使用Objection.js 自己的.page()或OFFSET等虚拟编号页面,然后插入或删除会导致某些记录被省略或重复。 安装 安装: npm install objection-keyset-pagination 注册插件: const Model = require ( '...
Objection.js是的 ,旨在不影响您的使用,并尽可能轻松地使用SQL和底层数据库引擎的全部功能,同时仍使常见的东西变得轻松愉快。 尽管ORM是描述异议的最著名的首字母缩写,但更准确的描述是将其称为关系查询生成器...
具有Postgres和Express的Objection.js教程 本教程演示了如何使用连接到数据库。 它还演示了如何使用迁移工具创建数据库模式以及如何创建种子数据。 请通过 :star: 如果您觉得有用的话! :beaming_face_with_smiling...
具有Postgres和Express的Objection.js教程 本教程演示了如何使用连接到数据库。 它还演示了如何使用迁移工具创建数据库模式以及如何创建种子数据。 请通过 :star: 如果您觉得有用的话! :beaming_face_with_smiling...