golang beego结合wire依赖注入及自动路由

news2025/1/15 12:53:10

1 安装wire

1.1 通过命令直接安装

go install github.com/google/wire/cmd/wire@latest

1.2 通过go get方式安装

go get github.com/google/wire/cmd/wire

进入目录编译

cd C:\Users\leell\go\pkg\mod\github.com\google\wire@v0.6.0\cmd\wire
go build

然后将wire.exe移动到 C:\Users\leell\go\bin目录下

具体目录通过go env进行查看

C:\Users\leell\go>go env
set GO111MODULE=on
set GOARCH=amd64
set GOBIN=C:\Users\leell\go\bin

2 配置业务代码

我没有按照beego的默认目录,而是通过自定义app包名进行业务模块化

2.1 分类模块

app/category/category_controller.go

type Controller struct {
	beego.Controller
	service *Service
}

func NewController(service *Service) *Controller {
	return &Controller{service: service}
}

app/category/category_service.go

type Service struct {
	dao *Dao
}

func NewService(dao *Dao) *Service {
	return &Service{dao}
}

app/category/category_dao.go 

type Dao struct {
}

func NewDao() *Dao {
	return &Dao{}
}

app/category/module.go

var CategorySet = wire.NewSet(NewController, NewService, NewDao)

2.2 项目wire定义总提供者provider

provider/provider.go

var AppSet = wire.NewSet(NewBeanFactory, category.CategorySet)

2.3 给项目一个bean工厂

这点有点像spring的beanfactory,这里主要是:

(1)解决beego路由一开始执行init能够得到所有controller的实例

(2)go项目中存在recycle的循环依赖,这里就可以用beanFactory做一个中间过度

var (
	appBeanFactory *BeanFactory
	once           sync.Once
)

type BeanFactory struct {
	CategoryController     *category.Controller
	CollectVideoController *controllers.CollectVideoController
}

func NewBeanFactory(categoryController *category.Controller) *BeanFactory {
	once.Do(func() {
		appBeanFactory = &BeanFactory{
			CategoryController: categoryController,
		}
	})
	return appBeanFactory
}

3 wire配置代码及生成gen代码

 wire/wire.go

//go:build wireinject
// +build wireinject

package wire

import (
	"zhiqu/provider"
)
import "github.com/google/wire"

// wire.go 初始化模块
func NewApp() (*provider.BeanFactory, error) {
	panic(wire.Build(provider.AppSet))
}

执行wire命令生成gen代码得到wire/wire_gen.go

wire gen wire/wire.go

生成最终代码文件内容

wire/wire_gen.go

// Code generated by Wire. DO NOT EDIT.

//go:generate go run -mod=mod github.com/google/wire/cmd/wire
//go:build !wireinject
// +build !wireinject

package wire

import (
	"zhiqu/app/category"
	"zhiqu/provider"
)

// Injectors from wire.go:

// wire.go 初始化模块
func NewApp() (*provider.BeanFactory, error) {
	categoryDao := category.NewDao()
	categoryService := category.NewService(categoryDao)
	categoryController := category.NewController(categoryService)
	beanFactory := provider.NewBeanFactory(categoryController)
	return beanFactory, nil
}

4 路由配置

routers/router.go

// Package routers @APIVersion 1.0.0
// @Title beego Test API
// @Description beego has a very cool tools to autogenerate documents for your API
// @Contact astaxie@gmail.com
// @TermsOfServiceUrl http://beego.me/
// @License Apache 2.0
// @LicenseUrl http://www.apache.org/licenses/LICENSE-2.0.html
package routers

import (
	beego "github.com/beego/beego/v2/server/web"
	"zhiqu/wire"
)

func init() {
//通过wire获取beanfactory
	beanFactory, err := wire.NewApp()
	if err != nil {
		panic(err)
	}
	ns := beego.NewNamespace("/v1",

		beego.NSNamespace("/category",
			beego.NSInclude(
				beanFactory.CategoryController,
			),
		)
	)
// 注册Swagger路由
	//beego.SetStaticPath("/swagger", "swagger")
	beego.AddNamespace(ns)
	
}

可以看出在路由文件中添加了wire生成的gen代码的获取的beanfactory工厂,然后将所有的单例go对象交由wire进行管理

5 根据controller上的注解生成路由自动映射

命令:由于我想做成业务模块化,而不是默认mvc的目录结构,所以添加-ctrlDir=app指定包含controller的目录app

C:\Users\leell\go\src\zhiqu>bee generate routers -ctrlDir=app 
2024/04/27 19:09:54 WARN     ▶ 0001 Your configuration file is outdated. Please do consider updating it.
______
| ___ \
| |_/ /  ___   ___
| ___ \ / _ \ / _ \
| |_/ /|  __/|  __/
\____/  \___| \___| v2.1.0
2024/04/27 19:09:54 WARN     ▶ 0002 Your configuration file is outdated. Please do consider updating it.
2024/04/27 19:09:54 INFO     ▶ 0003 input parameter: [routers -ctrlDir=app]
2024/04/27 19:09:54 INFO     ▶ 0004 read controller info from directory[app], and output routers to [routers/commentsRouter.go]
2024/04/27 19:09:56.660 [I] [gen_routes.go:421]  generate router from comments
2024/04/27 19:09:56 INFO     ▶ 0005 using routers as routers file's package
2024/04/27 19:09:56 SUCCESS  ▶ 0006 Routers successfully generated!

最终生成的路由匹配文件内容

routers/commentsRouter.go

package routers

import (
	beego "github.com/beego/beego/v2/server/web"
	"github.com/beego/beego/v2/server/web/context/param"
)

func init() {

    beego.GlobalControllerRouter["zhiqu/app/category:Controller"] = append(beego.GlobalControllerRouter["zhiqu/app/category:Controller"],
        beego.ControllerComments{
            Method: "Post",
            Router: `/`,
            AllowHTTPMethods: []string{"post"},
            MethodParams: param.Make(),
            Filters: nil,
            Params: nil})

    beego.GlobalControllerRouter["zhiqu/app/category:Controller"] = append(beego.GlobalControllerRouter["zhiqu/app/category:Controller"],
        beego.ControllerComments{
            Method: "GetAll",
            Router: `/`,
            AllowHTTPMethods: []string{"get"},
            MethodParams: param.Make(),
            Filters: nil,
            Params: nil})

    beego.GlobalControllerRouter["zhiqu/app/category:Controller"] = append(beego.GlobalControllerRouter["zhiqu/app/category:Controller"],
        beego.ControllerComments{
            Method: "GetOne",
            Router: `/:id`,
            AllowHTTPMethods: []string{"get"},
            MethodParams: param.Make(),
            Filters: nil,
            Params: nil})

    beego.GlobalControllerRouter["zhiqu/app/category:Controller"] = append(beego.GlobalControllerRouter["zhiqu/app/category:Controller"],
        beego.ControllerComments{
            Method: "Put",
            Router: `/:id`,
            AllowHTTPMethods: []string{"put"},
            MethodParams: param.Make(),
            Filters: nil,
            Params: nil})

    beego.GlobalControllerRouter["zhiqu/app/category:Controller"] = append(beego.GlobalControllerRouter["zhiqu/app/category:Controller"],
        beego.ControllerComments{
            Method: "Delete",
            Router: `/:id`,
            AllowHTTPMethods: []string{"delete"},
            MethodParams: param.Make(),
            Filters: nil,
            Params: nil})

    beego.GlobalControllerRouter["zhiqu/app/login:Controller"] = append(beego.GlobalControllerRouter["zhiqu/app/login:Controller"],
        beego.ControllerComments{
            Method: "Login",
            Router: `/`,
            AllowHTTPMethods: []string{"post"},
            MethodParams: param.Make(),
            Filters: nil,
            Params: nil})

}

6 查看最终结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1628724.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录:二叉树22-24

目录 700.二叉搜索树的搜索 题目 代码(二叉搜索树迭代) 代码(二叉搜索树递归) 代码(普通二叉树递归) 代码(普通二叉树迭代) 98.验证二叉搜索树 题目 代码(中序递…

嵌入式全栈开发学习笔记---Linux基本命令2

目录 cp 源路径 目的路径 cp -r 源路径 目的路径 mv 源路径 目的路径 mv oldname newname 接下来我们继续介绍两个常用的命令 一个是拷贝文件,一个是剪切文件 ,或者也可以用来改名字。 cp 源路径 目的路径 “cp”用来拷贝文件或者目录,…

Swagger3.0(Springdoc)日常使用记录

文章目录 前言一、默认地址二、注解OperationTag 三、SpringBoot基础配置四、Swagger导入apifox五、Swagger其他配置六 knife4j 参考文章 前言 本文并不是Swagger的使用教程,只是记录一下本人的操作,感兴趣的可以看下 一、默认地址 http://localhost:…

38-数组 _ 一维数组

38-1 数组的创建 数组是一组相同类型元素的集合。 数组的创建方式: type_t arr_name [const_n]; //type_t 是指数组的元素类型 //const_n是一个常量表达式,用来指定数组的大小 举例: int arr[10]; char ch[5]; double data[20]; 问&…

Vue基础:为什么要学Vue3,Vue3相较于Vue2有那些优势?

为什么要学Vue3? 1.框架层面 1.响应式底层API的变化 Proxy 数组下标的修改 对象动态添加属性 解释说明:1.vue2采用的是Object.definePrototype,它每次只能对单个对象中的单个数据进行劫持,所以在Vue2中data()中的数据一多就要进行…

香港BTC、ETH现货ETF同时通过,对行业意义几何?

香港比美国更快一步通过以太坊现货 ETF。 2024 年 4 月 15 日,香港嘉实国际资产管理有限公司(Harvest Global Investments)今天宣布,得到香港证监会的原则上批准,将推出两大数字资产(比特币及以太坊&#…

计算公式基础

文章目录 MASMAEXMPA加权移动平均线成交量换手率MACDKDJ MA 均线一般指移动平均线。 移动平均线,Moving Average,简称MA,MA是用统计分析的方法,将一定时期内的证券价格(指数)加以平均,并把不同…

RabbitMQ工作模式(5) - 主题模式

概念 主题模式(Topic Exchange)是 RabbitMQ 中一种灵活且强大的消息传递模式,它允许生产者根据消息的特定属性将消息发送到一个交换机,并且消费者可以根据自己的需求来接收感兴趣的消息。主题交换机根据消息的路由键和绑定队列的路…

梦境绘师:揭秘生成对抗网络(GAN)的魔法

梦境绘师:揭秘生成对抗网络(GAN)的魔法 1 引言 在今日的深度学习领域,生成对抗网络(GAN)已成为一项无人能外的技术,以其独特的数据生成能力俘获了无数研究者和工程师的心。这项技术不仅在理论上…

Golang基础2-Array、Slice、Map

Array 数组 var a [5]int b:[5]int{} c:[...]int{}这样格式定义var a[5]int 和var a[10]int是不同类型从0开始下标&#xff0c;到len(a)-1遍历方式&#xff1a; for i : 0; i < len(a); i { }for index, v : range a { } 注意越界问题&#xff0c;panic值类型&#xff0c;…

知识图谱嵌入领域的重要研究:编辑基于语言模型的知识图谱嵌入

今天&#xff0c;向大家介绍一篇在知识图谱嵌入领域具有重要意义的研究论文——Editing Language Model-based Knowledge Graph Embeddings。这项工作由浙江大学和腾讯公司的研究人员联合完成&#xff0c;为我们在动态更新知识图谱嵌入方面提供了新的视角和方法。 研究背景 在…

go设计模式之工厂方法模式

工厂方法模式 什么是工厂方法模式 工厂方法模式是一种创建型设计模式&#xff0c;它定义了一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。工厂方法使一个类的实例化推迟到其子类。 这个接口就是工厂接口&#xff0c;子类就是具体工厂类&#xff0c;而需要创…

盛水最多的容器 ---- 双指针

题目链接 题目: 分析: 最大容积 即使就是最大面积, 长为下标之差, 宽为两下标对应值的最小值解法一: 暴力枚举: 将每两个数之间的面积都求出来, 找最大值, 时间复杂度较高解法二: 假设我们的数组是[6, 2, 5, 4], 我们先假设最左边和最右边, 即6 和 4 之间是最大面积长a*宽b此…

便携式应急指挥箱规格参数

概况: 微缩型的无线视频音频传输的机动挥所。体积小、重量轻、公配电方便、携带便携、功能齐全。可进行单兵作战&#xff0c;通过此无线音频视频传输的指挥箱能完成现场图像、语音、数据的采集等功能&#xff0c;可以通过5G/4G/WIFI等多种无线网络完成传输的需求&#xff0c;或…

和鲸科技出席第五届空间数据智能学术会议,执行总裁殷自强受邀发表主题报告

4月26日&#xff0c;由 ACM SIGSPATIAL 中国分会、ACM SIGMOD 中国分会主办的第五届空间数据智能学术会议&#xff08;SpatialDI 2024&#xff0c;下简称“会议”&#xff09;在南京盛大开幕。本次会议特邀李清泉院士、周成虎院士、丛高教授、谢炯博士、张雪英教授等国内外知名…

流量网关与服务网关的区别:(面试题,掌握)

流量网关&#xff1a;&#xff08;如Nignx&#xff0c;OpenResty&#xff0c;Kong&#xff09;是指提供全局性的、与后端业务应用无关的策略&#xff0c;例如 HTTPS证书认证、Web防火墙、全局流量监控&#xff0c;黑白名单等。 服务网关&#xff1a;&#xff08;如Spring Clou…

通义灵码-IDEA的使用教程

通义灵码-IDEA的使用教程 1、通义灵码是什么&#xff1f; 通义灵码&#xff0c;是阿里云出品的一款基于通义大模型的智能编码辅助工具&#xff0c;提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码注释生成、代码解释、研发智能问答、异常报错排查等能力&#…

受尽折磨的ai剪辑视频心酸之路

因为公司需要剪辑好多视频~我每天不断手动剪啊剪啊手都剪麻 有天老板跟我说了句人家好多ai剪辑你能不能搞到一个&#xff0c;多少钱你在说。 我心想这不是我的强项么&#xff1f;白嫖界的天花板&#xff0c;我就拦下了这个活~于是我上班不是在找软件就是在逛论坛路上&#xff0…

【漏洞复现】润乾报表InputServlet13文件读取漏洞

漏洞描述&#xff1a; 润乾报表是一款功能全面且性能卓越的报表产品。它专注于企业级BI产品的研发和推广&#xff0c;通过提供丰富的报表功能和高效的开发工具&#xff0c;帮助用户提升图表的开发效率&#xff0c;节省成本。 润乾报表InputServlet13接口存在文件读取漏洞&…

数据结构 - 链表详解一 - 链表的介绍

一. 为什么要学习链表 我们已经学习了顺序表了&#xff0c;在学习的时候发现顺序表的功能很多&#xff0c;所以我们为什么还要学习链表呢&#xff0c;学习链表有什么用吗&#xff1f; 下面我将通过几个方面去研究一下 1. 动态数据操作 顺序表&#xff08;如数组&#xff09;通…