From a831df36a7471603af6c7047218cb5031d3b834e Mon Sep 17 00:00:00 2001 From: maxiaofeng Date: Sat, 4 Mar 2023 17:05:57 +0800 Subject: [PATCH] =?UTF-8?q?wire.go=E5=AE=9E=E7=8E=B0=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 +++--- cmd/main.go | 5 +-- cmd/wire.go | 30 +++-------------- cmd/wire_gen.go | 27 ++++------------ internal/router/accountbill_router.go | 34 -------------------- internal/router/api_router.go | 46 +++++++++++++++++++++++++++ internal/router/provider_set.go | 11 ++----- internal/router/user_router.go | 31 ------------------ 8 files changed, 67 insertions(+), 126 deletions(-) delete mode 100644 internal/router/accountbill_router.go create mode 100644 internal/router/api_router.go delete mode 100644 internal/router/user_router.go diff --git a/README.md b/README.md index da289f1..e049d34 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,3 @@ -## 下一步计划 -将本项目打造成快速开发框架,目前Java方向的快速开发框架非常多,包含完成度很高的管理后台、代码生成、组件集成等。但是Go方向相对较少,要么有但是很多按照PHP的玩法在做,因此后续规划为快速开发框架,会新起一个项目或者分支,在当前代码的基础上拓展。 - ### apiserver-gin 基于gin的api服务端脚手架。 gin在Go web开发中是相当受欢迎的,但是gin也是一个轻量级web框架,并不能像其他语言比如java的spring框架具有丰富的生态和标准,在实际开发中需要自己设计和添加一些额外的能力,来完善应用,比如:request_id透传,依赖注入,日志打印分割,session管理,全局错误处理,编译打包等等。 @@ -9,14 +6,18 @@ 布局参考[project-layout](https://github.com/golang-standards/project-layout),该项目非Go官方标准,但是已经是行业主流。 - ### 理论基础 + #### 清洁架构 [(Robert C. Martin)](https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html) + ![image](https://user-images.githubusercontent.com/8643542/159397149-17f58fba-a3c0-4874-b49a-ae724989af59.png) 按照依赖注入,面向对象编程思想,开闭原则,可拓展,可测性等原则来规划项目。 ### 更新日志 + +*2023-03-04:调整依赖注入wire.go实现,wire解决复杂依赖较为困难,每次对代码有破坏性更改,改为使用传参解决。* + *2022-05-27:添加新的演示功能,用户记账,用于演示脚手架多个router,handler,service的使用,详情见使用文档,升级viper版本,解决依赖安全问题。* *2022-04-01:拆分中间件和路由,不放在一起,便于团队开发时多人维护,比如用户模块的开发人员维护user_router.go,商品模块人员维护goods_router.go互相不影响,便于拓展,详情参考cmd/wire.go* diff --git a/cmd/main.go b/cmd/main.go index fa837e8..317d174 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -1,6 +1,7 @@ package main import ( + "apiserver-gin/internal/middleware" "apiserver-gin/pkg/config" "apiserver-gin/pkg/db" "apiserver-gin/pkg/log" @@ -26,6 +27,6 @@ func main() { ds.Close() } }) - routers := getRouters(ds) - srv.Run(routers...) + router := initRouter(ds) + srv.Run(middleware.NewMiddleware(), router) } diff --git a/cmd/wire.go b/cmd/wire.go index 3c7952e..b5ed038 100644 --- a/cmd/wire.go +++ b/cmd/wire.go @@ -10,7 +10,6 @@ package main import ( handlerV1 "apiserver-gin/internal/handler/v1" - "apiserver-gin/internal/middleware" "apiserver-gin/internal/repo/mysql" "apiserver-gin/internal/router" "apiserver-gin/internal/service" @@ -19,34 +18,13 @@ import ( "github.com/google/wire" ) -// getRouters 获取所有的router -func getRouters(ds db.IDataSource) []server.Router { - rts := make([]server.Router, 0) - // 加载中间件及路由, 注意需要先加载中间件 - rts = append(rts, - middleware.NewMiddleware(), - buildUserRouter(ds), - buildAccountBillRouter(ds), - ) - return rts -} - -var providerSet = wire.NewSet(mysql.ProviderSet, service.ProviderSet, handlerV1.ProviderSet) - -// buildUserRouter 组装UserRouter -func buildUserRouter(ds db.IDataSource) server.Router { +// initRouter 初始化router +func initRouter(ds db.IDataSource) server.Router { wire.Build( providerSet, - router.UserRouterProviderSet, + router.ApiRouterProviderSet, ) return nil } -// buildAccountBillRouter 组装AccountBillRouter -func buildAccountBillRouter(ds db.IDataSource) server.Router { - wire.Build( - providerSet, - router.AccountBillRouterProviderSet, - ) - return nil -} +var providerSet = wire.NewSet(mysql.ProviderSet, service.ProviderSet, handlerV1.ProviderSet) diff --git a/cmd/wire_gen.go b/cmd/wire_gen.go index ee77d71..0dca0c3 100644 --- a/cmd/wire_gen.go +++ b/cmd/wire_gen.go @@ -1,6 +1,6 @@ // Code generated by Wire. DO NOT EDIT. -//go:generate wire +//go:generate go run github.com/google/wire/cmd/wire //go:build !wireinject // +build !wireinject @@ -10,7 +10,6 @@ import ( "apiserver-gin/internal/handler/v1" "apiserver-gin/internal/handler/v1/accountbill" "apiserver-gin/internal/handler/v1/user" - "apiserver-gin/internal/middleware" "apiserver-gin/internal/repo/mysql" "apiserver-gin/internal/router" "apiserver-gin/internal/service" @@ -21,32 +20,18 @@ import ( // Injectors from wire.go: -func buildUserRouter(ds db.IDataSource) server.Router { +// initRouter 初始化router +func initRouter(ds db.IDataSource) server.Router { userRepo := mysql.NewUserRepo(ds) userService := service.NewUserService(userRepo) handler := user.NewUserHandler(userService) - userRouter := router.NewUserRouter(handler) - return userRouter -} - -func buildAccountBillRouter(ds db.IDataSource) server.Router { accountBillRepo := mysql.NewAccountBillRepo(ds) accountBillService := service.NewAccountBillService(accountBillRepo) - handler := accountbill.NewAccountBillHandler(accountBillService) - accountBillRouter := router.NewAccountBillRouter(handler) - return accountBillRouter + accountbillHandler := accountbill.NewAccountBillHandler(accountBillService) + apiRouter := router.NewApiRouter(handler, accountbillHandler) + return apiRouter } // wire.go: -// getRouters 获取所有的router -func getRouters(ds db.IDataSource) []server.Router { - rts := make([]server.Router, 0) - - rts = append(rts, middleware.NewMiddleware(), buildUserRouter(ds), - buildAccountBillRouter(ds), - ) - return rts -} - var providerSet = wire.NewSet(mysql.ProviderSet, service.ProviderSet, v1.ProviderSet) diff --git a/internal/router/accountbill_router.go b/internal/router/accountbill_router.go deleted file mode 100644 index c969a1a..0000000 --- a/internal/router/accountbill_router.go +++ /dev/null @@ -1,34 +0,0 @@ -// Created on 2022/5/27. -// @author tony -// email xmgtony@gmail.com -// description 账目清单router - -package router - -import ( - "apiserver-gin/internal/handler/v1/accountbill" - "apiserver-gin/internal/middleware" - "github.com/gin-gonic/gin" -) - -// accountBillRouter 账目清单router -type accountBillRouter struct { - abh *accountbill.Handler -} - -func NewAccountBillRouter(_abh *accountbill.Handler) *accountBillRouter { - return &accountBillRouter{ - abh: _abh, - } -} - -// Load 加载中间件和路由信息 -func (abr *accountBillRouter) Load(g *gin.Engine) { - // user group - ug := g.Group("/v1/accountBill", middleware.AuthToken()) - { - ug.GET("/list", abr.abh.GetAccountBillList()) - // login - ug.POST("", abr.abh.AddAccountBill()) - } -} diff --git a/internal/router/api_router.go b/internal/router/api_router.go new file mode 100644 index 0000000..f512eaa --- /dev/null +++ b/internal/router/api_router.go @@ -0,0 +1,46 @@ +// Created on 2023/3/4. +// @author tony +// email xmgtony@gmail.com +// description + +package router + +import ( + "apiserver-gin/internal/handler/v1/accountbill" + "apiserver-gin/internal/handler/v1/user" + "apiserver-gin/internal/middleware" + "github.com/gin-gonic/gin" +) + +type ApiRouter struct { + userHandler *user.Handler + accountBillHandler *accountbill.Handler +} + +func NewApiRouter( + userHandler *user.Handler, + accountBillHandler *accountbill.Handler) *ApiRouter { + return &ApiRouter{ + userHandler: userHandler, + accountBillHandler: accountBillHandler, + } +} + +// Load 实现了server/http.go:40 +func (ar *ApiRouter) Load(g *gin.Engine) { + // login + g.POST("/login", ar.userHandler.Login()) + // user group + ug := g.Group("/v1/user", middleware.AuthToken()) + { + ug.GET("", ar.userHandler.GetUserInfo()) + } + + // accountBill group + abg := g.Group("/v1/accountBill", middleware.AuthToken()) + { + abg.GET("/list", ar.accountBillHandler.GetAccountBillList()) + // login + abg.POST("", ar.accountBillHandler.AddAccountBill()) + } +} diff --git a/internal/router/provider_set.go b/internal/router/provider_set.go index dd1d7ee..aba11f5 100644 --- a/internal/router/provider_set.go +++ b/internal/router/provider_set.go @@ -10,12 +10,7 @@ import ( "github.com/google/wire" ) -var UserRouterProviderSet = wire.NewSet( - NewUserRouter, - wire.Bind(new(server.Router), new(*userRouter)), -) - -var AccountBillRouterProviderSet = wire.NewSet( - NewAccountBillRouter, - wire.Bind(new(server.Router), new(*accountBillRouter)), +var ApiRouterProviderSet = wire.NewSet( + NewApiRouter, + wire.Bind(new(server.Router), new(*ApiRouter)), ) diff --git a/internal/router/user_router.go b/internal/router/user_router.go deleted file mode 100644 index 1dfad44..0000000 --- a/internal/router/user_router.go +++ /dev/null @@ -1,31 +0,0 @@ -package router - -import ( - "apiserver-gin/internal/handler/v1/user" - "apiserver-gin/internal/middleware" - "github.com/gin-gonic/gin" -) - -// userRouter Router路由接口的默认实现 -type userRouter struct { - uh *user.Handler -} - -func NewUserRouter(_uh *user.Handler) *userRouter { - return &userRouter{ - uh: _uh, - } -} - -// Load 加载中间件和路由信息 -func (r *userRouter) Load(g *gin.Engine) { - // login - g.POST("/login", r.uh.Login()) - // user group - ug := g.Group("/v1/user", middleware.AuthToken()) - { - ug.GET("", r.uh.GetUserInfo()) - // login - ug.POST("/login", r.uh.Login()) - } -}