前言

依赖注入的好处和特点这里不讲述了,本篇文章主要介绍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. IT兄弟连 HTML5教程 HTML5的基本语法 了解Web

    HTML也是计算机编程语言,但由于功能简单易用,不涉及业务逻辑,算是编程语言中最简单的了.其实学习HTML这门语言,就是在学习一个个HTML标记的使用,标记的名称和使用不是自定义的,它的功能及用法是已 ...

  2. MongoDB自学------(5)MongoDB分片

    分片 在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求. 当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量. ...

  3. WPF 使用EventTrigger时设置SouceName技巧

    使用情节触发器时,如果有触发源/触发源控件时可以将情节触发器放置最顶级的面板控件的触发器中. 通过blend这个神器真的是可以学到不少东西. 代码: //情节动画放置于顶级控制面板 <Widno ...

  4. XAML属性和事件

    1.元素属性 XAML是一种声明性语言,XAML编译器会为每一个标签创建一个与之对应的对象.对象创建出来之后要对它的属性进行必要的初始化之后才有使用意义.因为XAML语言不能写程序运行逻辑,所以一份X ...

  5. java基础第十七篇之网络编程和装饰者模式

    1:网络概述 1.1 网络的发展Net 1964年,美国人---> 阿帕网--->以太网Internet 1.2 网络的通信协议 windows电脑,android手机,Mac平板---& ...

  6. JS的with关键字到底是什么?

    with关键字 with在JS中通常被当做重复引用同一个对象多个属性的快捷方式. var obj = { a: 1, b: 2, c: 3 }; // 重复引用obj进行属性赋值 obj.a = 3; ...

  7. 交互式shell脚本web console

    官网:http://web-console.org/ 这个脚本可以实现web下交互,也就是有了这玩意后可以不用反弹shell了. <?php // Web Console v0.9.7 (201 ...

  8. INSTALL_FAILED_NO_MATCHING_ABIS解决办法

    解决方法: 在project切换到Android状态下的build.grade(Module:app)中添加如下内容即可: splits { abi { enable true reset() inc ...

  9. 一文解读5G (转)

    今天要研究的对象,是5G接入网. 什么是接入网?相信不少同学,对这个概念一定不会陌生. 搬出这张移动通信架构图: 接入网,在我们无线通信里,一般指无线接入网,也就是通常所说的RAN(Radio Acc ...

  10. 【微信小程序】安装DingoApi开发小程序api

    1.安装 composer require dingo/api 2.发布配置: php artisan vendor:publish 选择DingoApi发布. 3.向.env文件添加配置 (1)项目 ...