0
点赞
收藏
分享

微信扫一扫

Kafka知识总结(基本介绍+基本概念)

【Gin】智慧架构的巧妙砌筑:Gin框架中控制反转与依赖注入模式的精华解析与应用实战(下)

在这里插入图片描述


前言

本次文章分为上下两部分,上部分为对理论的介绍,下部分为具体的底层代码深度剖析和编程实践,感兴趣的伙伴不要错过哦~


关键的类图和时序图

(1) 类图
在Gin框架中,依赖注入具体体现在Gin的引擎对象engineRun方法内部处理业务时,将引擎对象engine注入到Run方法中进行业务的处理。控制反转则体现在处理业务的控制权从Gin的引擎对象enginenet/http库再反转到Gin的引擎对象engine进行真正的业务处理。


依赖注入:
角色说明:

Client:
客户端类,依赖注入的使用者。
持有一个或多个服务对象的引用,通过构造函数注入或者方法注入的方式获取服务实例,并调用服务对象的方法。


Handler:
服务接口,定义了客户端使用的操作接口。


Handler1:
具体的服务实现类,实现了Handler接口的方法。
在这里插入图片描述

图69 依赖注入类图


控制反转:
Client:
客户端类,创建一个处理业务的Gin引擎对象engine


Http:
IoC容器,负责管理和解析依赖对象,用于将依赖注入到engine对象中。


Handler:
服务接口或者抽象类,定义了依赖对象的操作接口。


ConcreteHandler:

真正处理业务对象的类,将控制权从Http中转移到到Gin引擎对象engine。
由Gin引擎对象engine来实现Gin框架内部的真正处理业务的接口Handler来真正处理业务,实现控制权的反转。

在这里插入图片描述

图70 控制反转类图


(2) 时序图
依赖注入:
在这里插入图片描述

图71 依赖注入类图


控制反转:
在这里插入图片描述

图72 控制反转类图


主程序的流程

依赖注入:

在这里插入图片描述

图73 依赖注入主程序流程图

控制反转:

图74 控制反转主程序流程图

在这里插入图片描述

程序模块之间的调用关系

在这里插入图片描述

图75 依赖注入和控制反转调用剖析图


控制反转:

下面是对上图75各层次调用关系的描述:

整理依赖注入和控制反转模型如下:
在这里插入图片描述

图76 依赖注入和控制反转模型图


在这里插入图片描述

图77客户端调用Run方法


在这里插入图片描述

图78 engine对象的 Run方法
代码位置:gin.go的389行、399行

控制反转:
同样地,客户端调用Run方法,启动HTTP服务器。
在这里插入图片描述

图79 客户端调用Run方法


Gin框架启动时,将处理对象的控制权移交给net/httphttp.ListenAndServe(address, engine.Handler())处理。
在这里插入图片描述

图80 engine对象的 Run方法
代码位置:gin.go的389行、399行


在这里插入图片描述

图81 engine的Handler()方法
代码位置:gin.go的228-235行


依赖注入和控制反转案例及调试分析

依赖注入是一种设计模式,它通过外部实体来提供一个类或对象所依赖的对象。简单来说,就是把依赖关系从一个对象转移到另一个对象,从而实现解耦和灵活性。控制反转是一种设计原则,它反转了传统的程序控制流程,将控制权交给了外部系统或容器。即,不再由调用方决定依赖对象的获取方式,而是由外部容器管理和提供依赖。


基于上述描述,编写测试案例如下:
在这里插入图片描述

图121 定义UserService服务接口
UserService 是一个接口,定义了获取用户信息的方法 GetUser。返回客户端输入的用户ID


在这里插入图片描述

图122 声明UserService的一个实现
UserServiceImpl 结构体实现了UserService接口,即它必须实现 GetUser(userID string) string 方法。


在这里插入图片描述

图123 定义GetUser()方法
UserServiceImpl 结构体实现了GetUser(userID string) string方法,这里假设它通过 userID 获取用户信息并返回字符串格式化的结果。


在这里插入图片描述

图124 编写客户端代码


调试分析:
启动测试案例的服务端,完成对象的依赖注入,并等待客户端请求的发送。运行测试依赖注入与控制反转案例成功!

在这里插入图片描述

图125启动测试案例成功
使用API测试工具APIfox,向服务器监听的端口发送GET请求,并得到服务端发送的响应信息,依赖对象处理业务成功,并将响应信息回写给客户端,调试依赖注入和控制反转案例成功!


在这里插入图片描述

图126 Apifox发起GET请求


依赖注入和控制反转测试结果

使用API测试工具APIfox,向服务器监听的端口发送GET请求,并得到服务端发送的响应信息,依赖对象处理业务成功,并将响应信息回写给客户端,测试依赖注入案例成功!

在这里插入图片描述

图146依赖注入客户端测试结果

接下来观察控制台的输出信息是否和预期的一致,一致则说明实现了控制反转:
先输出:控制权由Gin管理
再输出:控制权由net/http管理
最后又输出:控制权由Gin管理
观察发现,控制台输出顺序与预估的一致:
先输出:控制权由Gin管理
再输出:控制权由net/http管理
最后又输出:控制权由Gin管理
说明实现控制反转成功!

在这里插入图片描述

图147 控制反转测试结果


结语



在这里插入图片描述

往期好文💕

保姆级教程

【保姆级教程】Windows11下go-zero的etcd安装与初步使用

【保姆级教程】Windows11安装go-zero代码生成工具goctl、protoc、go-zero

【Go-Zero】手把手带你在goland中创建api文件并设置高亮


报错解决

【Go-Zero】Error: user.api 27:9 syntax error: expected ‘:‘ | ‘IDENT‘ | ‘INT‘, got ‘(‘ 报错解决方案及api路由注意事项

【Go-Zero】Error: only one service expected goctl一键转换生成rpc服务错误解决方案

【Go-Zero】【error】 failed to initialize database, got error Error 1045 (28000):报错解决方案

【Go-Zero】Error 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)报错解决方案

【Go-Zero】type mismatch for field “Auth.AccessSecret“, expect “string“, actual “number“报错解决方案

【Go-Zero】Error: user.api 30:2 syntax error: expected ‘)‘ | ‘KEY‘, got ‘IDENT‘报错解决方案

【Go-Zero】Windows启动rpc服务报错panic:context deadline exceeded解决方案


Go面试向

【Go面试向】defer与time.sleep初探

【Go面试向】defer与return的执行顺序初探

【Go面试向】Go程序的执行顺序

【Go面试向】rune和byte类型的认识与使用

【Go面试向】实现map稳定的有序遍历的方式

举报

相关推荐

0 条评论