- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
第
swift依赖注入和依赖注入容器详解
目录什么是控制反转(InversionofControl)?什么是依赖注入?依赖注入的种类初始化器注入属性注入方法注入依赖注入容器实现一个简单的依赖注入容器总结
什么是控制反转(InversionofControl)?
控制反转就是把传统的控制逻辑委托给另一个类或框架来处理,客户方只需实现具体的任务而不需要关心控制逻辑。
举个例子,比如存在客户方和服务方两个类,客户方需要调用服务方的函数来执行某个逻辑。在传统的编程方式中,客户方根据自己的需求直接去调用服务方的函数从而达到目的。而控制反转,则是把控制逻辑交给服务方,服务方提供了一个控制流的框架,具体的内容需要由客户方来填充,也就是说对流程的控制反转了,现在是服务方调用客户方。据说好莱坞有句名言Dontcallus,wellcallyou,差不多就是这个意思。以上的服务方也可以是库代码或者框架。
在iOS开发中,有一个非常常见的控制反转的实现,可能很多人都没有意识到这个就是控制反转,那就是completionHandler,或者说callback。
API.request(completion:{datain
handleData(data)
在这个例子中,业务方只需要关系拿到数据以后干什么,而不关心completion的调用时机,把completion的调用委托给了网络库,这就是控制反转。
控制反转可以让主要任务和控制逻辑分离,可以提升代码的模块性和扩展性,让代码松耦合,并可以让写测试代码变得简单。
常见的控制反转的实现有:
服务定位器(ServiceLocator)依赖注入上下文查找(Contextualizedlookup)模板方法(Templatemethod)策略模式(Strategydesignpattern)
本文仅讨论依赖注入这种实现,暂不讨论其他的实现。
什么是依赖注入?
依赖注入是控制反转的一种具体实现。它在类的外部创建这个类的依赖对象,然后通过某个方式把这个依赖对象提供给类。通过依赖注入,把依赖对象的创建和绑定都移动到了类的外部。
先看下面的例子:
classCar{
vartyres:[Tyre]
init(){
lettyre1=Tyre()
lettyre2=Tyre()
lettyre3=Tyre()
lettyre4=Tyre()
tyres=[tyre1,tyre2,tyre3,tyre4]
这个例子中构建了一个汽车对象,汽车对象的构建需要拼装4个轮胎。这个代码的缺点显而易见,就是轮胎的创建逻辑和汽车本身耦合了。当我们想换成另一种轮胎时,或者Tyre类调整了实现在构造时添加了一个参数,都必须改动Car类中的代码。
用依赖注入的方式,把依赖对象的创建和绑定挪到类外部,就能解决这类问题。
classCar{
vartyres:[Tyre]
init(types:[Tyre]){
self.types=types
再举个例子,App开发中常见的网络请求-数据处理-数据渲染流程,传统方式开发如下:
//DataViewModel.swift
funcloadData(){
API.requestData(id:2222,completion:{datain
self.handleData(data)
这样的代码是无法测试的,因为ViewModel和具体的网络请求实现耦合了。为了让loadData这个方法可以被测试,应该抽象一个网络请求的接口,然后从外部注入这个接口的实现。如下代码:
protocolNetworking{
funcrequestData(id:Int,completion:(Data)-Void)
让DataViewModel拥有一个需要注入的属性对象:
classDataViewModel{
letnetworking:Networking
init(networking:Networking){
working=networking
loadData方法修改如下:
funcloadData(completion:(()-Void)){
networking.requestData(id:2222,completion:{da
文档评论(0)