ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码
当前位置:首页 >> 网络编程 >> IOS开发 >> [iOS]一次高效的依赖注入

[iOS]一次高效的依赖注入(1/5)

来源:网络整理     时间:2018-10-31     关键词:

本篇文章主要介绍了" [iOS]一次高效的依赖注入",主要涉及到方面的内容,对于IOS开发感兴趣的同学可以参考一下: 文章涉及依赖注入方案基于 EXTConcreteProtocol 实现,GitHub链接在这里。01. 问题场景如果基于 Cocopods 和 Git Subm...

文章涉及依赖注入方案基于 EXTConcreteProtocol 实现,GitHub链接在这里

01. 问题场景

如果基于 Cocopods 和 Git Submodules 来做组件化的时候,我们的依赖关系是这样的:

这里依赖路径有两条:

  1. 最简单的主项目依赖第三方 pods。

  2. 组件依赖第三方 pods,主项目再依赖组件。

这种单向的依赖关系,决定了从组件到项目的通讯是单向的,即主项目可以主动向组件发起通讯,但是组件却没有办法主动和主项目通讯。

你可能说不对,可以发通知啊?是的,是可以发通知,但是这一点都不优雅,也不好维护和拓展。

有没有一种更加优雅、更加方便日常开发的拓展和维护的方式呢?答案是有的,名字叫做“依赖注入”。

02. 依赖注入

依赖注入有另外一个名字,叫做“控制反转”,像上面的组件化的例子,主项目依赖组件,现在有一个需求,组件需要依赖主项目,这种情况就叫做“控制反转”。

能把这部分“控制反转”的代码统一起来解耦维护,方便日后拓展和维护的服务,我们就可以叫做依赖注入。

所以依赖注入有两个比较重要的点:

  • 第一,要实现这种反转控制的功能。

  • 第二,要解耦。

不是我自身的,却是我需要的,都是我所依赖的。一切需要外部提供的,都是需要进行依赖注入的。

这句话出自这篇文章:理解依赖注入与控制反转 | Laravel China 社区 - 高品质的 Laravel 开发者社区

如果对概念性的东西有更加深入的理解,欢迎谷歌搜索“依赖注入”。

03. iOS 依赖注入调查

iOS 平台实现依赖注入功能的开源项目有两个大头:

  • objection GitHub - atomicobject/objection: A lightweight dependency injection framework for Objective-C

  • Typhoon GitHub - appsquickly/Typhoon: Powerful dependency injection for iOS & OSX (Objective-C & Swift)

详细对比发现这两个框架都是严格遵循依赖注入的概念来实现的,并没有将 Objective-C 的 runtime 特性发挥到极致,所以使用起来很麻烦。

还有一点,这两个框架使用继承的方式实现注入功能,对项目的侵入性不容小视。如果你觉得这个侵入性不算什么,那等到你项目大到一定程度,发现之前选择的技术方案有考虑不周,你想切换到其他方案的时候,你一定会后悔当时没选择那个不侵入项目的方案。

那有没有其他没那么方案呢?

GitHub - jspahrsummers/libextobjc: A Cocoa library to extend the Objective-C programming language. 里有一个 EXTConcreteProtocol 虽然没有直接叫做依赖注入,而是叫做混合协议,但是充分使用了 OC 动态语言的特性,不侵入项目,高度自动化,框架十分轻量,使用非常简单。

轻量到什么地步?就只有一个 .h 一个 .m 文件。

简单到什么地步?就只需要一个 @conreteprotocol关键字,你就已经注入好了。

从一个评价开源框架的方方面面都甩开上面两个框架好几条街。

相关图片

相关文章