Gin实现依赖注入
前言
依赖注入的好处和特点这里不讲述了,本篇文章主要介绍gin框架如何实现依赖注入,将项目解耦。
项目结构
├── cmd 程序入口
├── common 通用模块代码
├── config 配置文件
├── controller API控制器
├── docs 数据库文件
├── models 数据表实体
├── page 页面数据返回实体
├── repository 数据访问层
├── router 路由
├── service 业务逻辑层
├── vue-admin Vue前端页面代码
相信很多Java或者.NET的码友对这个项目结构还是比较熟悉的,现在我们就用这个项目结构在gin框架中实现依赖注入。这里主要介绍controller、service和repository。
数据访问层repository
- 首先定义IStartRepo接口,里面包括Speak方法
//IStartRepo 定义IStartRepo接口
type IStartRepo interface {
Speak(message string) string
}
- 实现该接口,这里就不访问数据库了,直接返回数据
//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
- 定义IStartService接口
//IStartService 定义IStartService接口
type IStartService interface {
Say(message string) string
}
- 实现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
- 注入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实现依赖注入的更多相关文章
- go语言依赖注入实现
最近做项目中,生成对象还是使用比较原始的New和简单工厂的方式,使用过程中感觉不太爽快(依赖紧密,有点改动就比较麻烦),还是比较喜欢使用依赖注入的方式. 然后网上没有找到比较好用的依赖注入包,就自己动 ...
- webapi - 使用依赖注入
本篇将要和大家分享的是webapi中如何使用依赖注入,依赖注入这个东西在接口中常用,实际工作中也用的比较频繁,因此这里分享两种在api中依赖注入的方式Ninject和Unity:由于快过年这段时间打算 ...
- ASP.NET Core 中文文档 第四章 MVC(3.8)视图中的依赖注入
原文:Dependency injection into views 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:孟帅洋(书缘) ASP.NET Core 支持在视图中使用 依赖 ...
- 在WPF中使用依赖注入的方式创建视图
在WPF中使用依赖注入的方式创建视图 0x00 问题的产生 互联网时代桌面开发真是越来越少了,很多应用都转到了浏览器端和移动智能终端,相应的软件开发上的新技术应用到桌面开发的文章也很少.我之前主要做W ...
- MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息
MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...
- .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整-控制反转和依赖注入的使用
再次调整项目架构是因为和群友dezhou的一次聊天,我原来的想法是项目尽量做简单点别搞太复杂了,仅使用了DbContext的注入,其他的也没有写接口耦合度很高.和dezhou聊过之后我仔细考虑了一下, ...
- ASP.NET Core中如影随形的”依赖注入”[下]: 历数依赖注入的N种玩法
在对ASP.NET Core管道中关于依赖注入的两个核心对象(ServiceCollection和ServiceProvider)有了足够的认识之后,我们将关注的目光转移到编程层面.在ASP.NET ...
- ASP.NET Core中如影随形的”依赖注入”[上]: 从两个不同的ServiceProvider说起
我们一致在说 ASP.NET Core广泛地使用到了依赖注入,通过前面两个系列的介绍,相信读者朋友已经体会到了这一点.由于前面两章已经涵盖了依赖注入在管道构建过程中以及管道在处理请求过程的应用,但是内 ...
- 模拟AngularJS之依赖注入
一.概述 AngularJS有一经典之处就是依赖注入,对于什么是依赖注入,熟悉spring的同学应该都非常了解了,但,对于前端而言,还是比较新颖的. 依赖注入,简而言之,就是解除硬编码,达到解偶的目的 ...
随机推荐
- 微信公众号开发 ,redirect_uri域名还是与后台配置不一致
测试账号地址: https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index https ...
- transaction事务案例--银行转账
1)dao层 package cn.spring.transaction.dao; public interface MoneyDao { //加钱的方法 void addMoney(double m ...
- Anaconda安装第三方库与pip和conda 添加国内源
Anaconda安装第三方库 PIP使用命令 Anaconda命令 pip和conda 添加国内源 1:PIP相关命令 卸载 pip uninstall XXX 1.升级pip python -m p ...
- Bootstrap --------- 了解与使用
Bootstrap是用来做什么的?有几大部分?谁开发的?有什么特点? 一个用于快速开发 Web 应用程序和网站的前端框架. 基于 HTML.CSS.JAVASCRIPT 的. 2011 年八月在 Gi ...
- 为何我建议1-3年的Java程序员仔细看看这篇文章
此文的目的是为了督促自己去不断学习,让自己有更明确的方向去提升自己.以技能树为基础,以面试要点为大纲,我觉得比抓住什么看什么要更有目的,更能坚持下去.世界瞬息万变,我们要时刻准备着.时刻提高着自己,才 ...
- SAS与SATA的区别
SAS SATA的区别 协议方面 SAS(Serial Attached SCSI)即串行连接SCSI,SATA(Serial Advanced Technology Attachment)即串行高级 ...
- solidity智能合约implicit conversion异常
问题场景 在使用^0.5.10版本的solidity时,如果使用this关键字会出现以下问题. 代码: require(tokenContract.balanceOf(this) >= _num ...
- Razor_06 列表的查询
Razor_06 列表的查询 列表的查询 同步/AJAX 查询 分局部视图[强类型] system.text.Json Ajax 返回 Json 数据 , System.Text.Json .循环引 ...
- FCC---Animate Elements at Variable Rates----一闪一闪亮晶晶,不同的闪动节奏
There are a variety of ways to alter the animation rates of similarly animated elements. So far, thi ...
- jsp表单更新数据库
和插入语句相似,表单传值,在另一个页面接收数据并连接数据库进行更新: 语句如下: <% request.setCharacterEncoding("UTF-8"); Stri ...