Gin实现依赖注入

939496716 · · 2106 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

[原文地址](https://bingjian-zhu.github.io/2019/11/06/Gin%E5%AE%9E%E7%8E%B0%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5/) ### 前言 依赖注入的好处和特点这里不讲述了,本篇文章主要介绍gin框架如何实现依赖注入,将项目解耦。 ### 项目结构 <pre><code> ├── cmd 程序入口 ├── common 通用模块代码 ├── config 配置文件 ├── controller API控制器 ├── docs 数据库文件 ├── models 数据表实体 ├── page 页面数据返回实体 ├── repository 数据访问层 ├── router 路由 ├── service 业务逻辑层 ├── vue-admin Vue前端页面代码 </code></pre> 相信很多Java或者.NET的码有对这个项目结构还是比较熟悉的,现在我们就用这个项目结构在gin框架中实现依赖注入。这里主要介绍controller、service和repository。 ### 数据访问层repository 1. 首先定义IStartRepo接口,里面包括Speak方法 ```go //IStartRepo 定义IStartRepo接口 type IStartRepo interface { Speak(message string) string } ``` 2. 实现该接口,这里就不访问数据库了,直接返回数据 ```go //StartRepo 注入数据库 type StartRepo struct { Source datasource.IDb `inject:""` } //Speak 实现Speak方法 func (s *StartRepo) Speak(message string) string { //使用注入的IDb访问数据库 //s.Source.DB().Where("name = ?", "jinzhu").First(&user) return fmt.Sprintf("[Repository] speak: %s", message) } ``` 这样我们就简单完成了数据库访问层的接口封装 ### 业务逻辑层service 1. 定义IStartService接口 ```go //IStartService 定义IStartService接口 type IStartService interface { Say(message string) string } ``` 2. 实现IStartService接口方法,注入IStartRepo数据访问层 ```go //StartService 注入IStartRepo type StartService struct { Repo repository.IStartRepo `inject:""` } //Say 实现Say方法 func (s *StartService) Say(message string) string { return s.Repo.Speak(message) } ``` ### 控制器controller 1. 注入IStartService业务逻辑层,并调用Say方法 ```go //Index 注入IStartService type Index struct { Service service.IStartService `inject:""` } //GetName 调用IStartService的Say方法 func (i *Index) GetName(ctx *gin.Context) { var message = ctx.Param("msg") ctx.JSON(200, i.Service.Say(message)) } ``` ### 注入gin中 到此三个层此代码已写好,然后我们使用`"github.com/facebookgo/inject"`Facebook的工具包将它们注入到gin中。 ```go func Configure(app *gin.Engine) { //controller declare var index controller.Index //inject declare db := datasource.Db{} //Injection var injector inject.Graph err := injector.Provide( &inject.Object{Value: &index}, &inject.Object{Value: &db}, &inject.Object{Value: &repository.StartRepo{}}, &inject.Object{Value: &service.StartService{}}, ) if err != nil { log.Fatal("inject fatal: ", err) } if err := injector.Populate(); err != nil { log.Fatal("inject fatal: ", err) } //database connect err = db.Connect() if err != nil { log.Fatal("db fatal:", err) } v1 := app.Group("/") { v1.GET("/get/:msg", index.GetName) } } ``` 有关更多的github.com/facebookgo/inject使用方法请参考[文档](https://godoc.org/github.com/facebookgo/inject) 本demo源码地址:https://github.com/Bingjian-Zhu/gin-inject

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2106 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传