前言

依赖注入的好处和特点这里不讲述了,本篇文章主要介绍gin框架如何实现依赖注入,将项目解耦。

项目结构


├── cmd 程序入口
├── common 通用模块代码
├── config 配置文件
├── controller API控制器
├── docs 数据库文件
├── models 数据表实体
├── page 页面数据返回实体
├── repository 数据访问层
├── router 路由
├── service 业务逻辑层
├── vue-admin Vue前端页面代码

相信很多Java或者.NET的码友对这个项目结构还是比较熟悉的,现在我们就用这个项目结构在gin框架中实现依赖注入。这里主要介绍controller、service和repository。

数据访问层repository

  1. 首先定义IStartRepo接口,里面包括Speak方法
//IStartRepo 定义IStartRepo接口
type IStartRepo interface {
Speak(message string) string
}
  1. 实现该接口,这里就不访问数据库了,直接返回数据
//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接口
//IStartService 定义IStartService接口
type IStartService interface {
Say(message string) string
}
  1. 实现IStartService接口方法,注入IStartRepo数据访问层
//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方法
//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中。

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使用方法请参考文档

本demo源码地址:https://github.com/Bingjian-Zhu/gin-inject

Gin实现依赖注入的更多相关文章

  1. go语言依赖注入实现

    最近做项目中,生成对象还是使用比较原始的New和简单工厂的方式,使用过程中感觉不太爽快(依赖紧密,有点改动就比较麻烦),还是比较喜欢使用依赖注入的方式. 然后网上没有找到比较好用的依赖注入包,就自己动 ...

  2. webapi - 使用依赖注入

    本篇将要和大家分享的是webapi中如何使用依赖注入,依赖注入这个东西在接口中常用,实际工作中也用的比较频繁,因此这里分享两种在api中依赖注入的方式Ninject和Unity:由于快过年这段时间打算 ...

  3. ASP.NET Core 中文文档 第四章 MVC(3.8)视图中的依赖注入

    原文:Dependency injection into views 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:孟帅洋(书缘) ASP.NET Core 支持在视图中使用 依赖 ...

  4. 在WPF中使用依赖注入的方式创建视图

    在WPF中使用依赖注入的方式创建视图 0x00 问题的产生 互联网时代桌面开发真是越来越少了,很多应用都转到了浏览器端和移动智能终端,相应的软件开发上的新技术应用到桌面开发的文章也很少.我之前主要做W ...

  5. MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息

    MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...

  6. .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整-控制反转和依赖注入的使用

    再次调整项目架构是因为和群友dezhou的一次聊天,我原来的想法是项目尽量做简单点别搞太复杂了,仅使用了DbContext的注入,其他的也没有写接口耦合度很高.和dezhou聊过之后我仔细考虑了一下, ...

  7. ASP.NET Core中如影随形的”依赖注入”[下]: 历数依赖注入的N种玩法

    在对ASP.NET Core管道中关于依赖注入的两个核心对象(ServiceCollection和ServiceProvider)有了足够的认识之后,我们将关注的目光转移到编程层面.在ASP.NET ...

  8. ASP.NET Core中如影随形的”依赖注入”[上]: 从两个不同的ServiceProvider说起

    我们一致在说 ASP.NET Core广泛地使用到了依赖注入,通过前面两个系列的介绍,相信读者朋友已经体会到了这一点.由于前面两章已经涵盖了依赖注入在管道构建过程中以及管道在处理请求过程的应用,但是内 ...

  9. 模拟AngularJS之依赖注入

    一.概述 AngularJS有一经典之处就是依赖注入,对于什么是依赖注入,熟悉spring的同学应该都非常了解了,但,对于前端而言,还是比较新颖的. 依赖注入,简而言之,就是解除硬编码,达到解偶的目的 ...

随机推荐

  1. 【nginx启动报错】重启服务器之后nginx启动错

    错误信息: # ./nginx  nginx: [emerg] open() "/var/run/nginx/nginx.pid" failed (2: No such file ...

  2. U-GAT-IT笔记

    目录 前言 模型结构 生成器 鉴别器 损失函数 实验结果 结语 由于博客园有时候公式显示不出来,建议在https://github.com/FangYang970206/PaperNote/blob/ ...

  3. 运行时报:尝试加载 Oracle 客户端库时引发 BadImageFormatException,如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题

    运行环境为: Windows Server2012 Oracle11g  32位数据库+客户端 IIS发布后提示错误信息: “尝试加载 Oracle 客户端库时引发 BadImageFormatExc ...

  4. nikto---基本使用

    目录 一:基本使用 二:调节扫描过程 三:命令行选项 四:配置文件 注意:使用版本:Nikto v2.1.6 功能:Web服务器评估工具,目的在于查找任何类型的Web服务器的各种默认和不安全的文件,配 ...

  5. 剑指offer 16:反转链表

    题目描述 输入一个链表,反转链表后,输出新链表的表头. 解题思路 单链表原地反转是面试手撕代码环节非常经典的一个问题.针对一般单链表,反转的时候需要操作的是当前节点及与之相邻的其他两个节点.因而需要定 ...

  6. java annotation使用介绍

    还望支持个人博客站:http://www.enjoytoday.cn 介绍 Annotation的中文名字叫注解,开始与JDK 1.5,为了增强xml元数据和代码的耦合性的产物.注解本身并没有业务逻辑 ...

  7. 使用Socket下载图片

    Socket下载一张图片 Socket下载一页图片 Socket下载一张图片 在百度搜索头像,挑一张 复制图片的路径打开,并保存这个url 把这个url的域名和路径分开 首先导入socket模块 第一 ...

  8. 解决vue+springboot前后端分离项目,前端跨域访问sessionID不一致导致的session为null问题

    问题: 前端跨域访问后端接口, 在浏览器的安全策略下默认是不携带cookie的, 所以每次请求都开启了一次新的会话. 在后台打印sessionID我们会发现, 每次请求的sessionID都是不同的, ...

  9. 《大话处理器》Cache一致性协议之MESI【转】

    转自:https://blog.csdn.net/muxiqingyang/article/details/6615199 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载 ...

  10. linux 安装PostgreSQL12

    一.安装步骤 1.设置保存安装包的目录 # cd /usr/local/src 2.开始下载源包 # wget https://ftp.postgresql.org/pub/source/v12.1/ ...