From 9efd20f1b92db5770df7670b9efa900a37e701b2 Mon Sep 17 00:00:00 2001 From: "meilin.huang" <954537473@qq.com> Date: Mon, 22 Jan 2024 11:35:28 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20ioc=E4=B8=8E=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E5=A4=84=E7=90=86=E6=96=B9=E5=BC=8F?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/initialize/initialize.go | 43 ++++++++++--- server/initialize/router.go | 38 +++++------- server/initialize/savelog.go | 10 --- server/initialize/terminate.go | 16 ++++- .../internal/auth/application/application.go | 2 +- server/internal/auth/init/init.go | 12 ++++ server/internal/common/init/init.go | 10 +++ server/internal/db/application/application.go | 2 +- server/internal/db/init/init.go | 13 +++- .../machine/application/application.go | 2 +- server/internal/machine/init/init.go | 8 +++ .../internal/mongo/application/application.go | 2 +- server/internal/mongo/init/init.go | 12 ++++ .../internal/msg/application/application.go | 2 +- server/internal/msg/init/init.go | 12 ++++ .../internal/redis/application/application.go | 2 +- server/internal/redis/init/init.go | 12 ++++ .../internal/sys/application/application.go | 2 +- server/internal/sys/init/init.go | 12 ++++ .../internal/tag/application/application.go | 2 +- server/internal/tag/init/init.go | 12 ++++ server/main.go | 9 +++ server/pkg/ioc/default.go | 5 ++ server/pkg/ioc/ioc.go | 6 +- server/pkg/ioc/ioc_test.go | 62 +++++++++++++++++++ server/pkg/starter/web-server.go | 4 +- 26 files changed, 257 insertions(+), 55 deletions(-) delete mode 100644 server/initialize/savelog.go create mode 100644 server/internal/auth/init/init.go create mode 100644 server/internal/common/init/init.go create mode 100644 server/internal/mongo/init/init.go create mode 100644 server/internal/msg/init/init.go create mode 100644 server/internal/redis/init/init.go create mode 100644 server/internal/sys/init/init.go create mode 100644 server/internal/tag/init/init.go create mode 100644 server/pkg/ioc/ioc_test.go diff --git a/server/initialize/initialize.go b/server/initialize/initialize.go index 03f9beb6..df1f31ab 100644 --- a/server/initialize/initialize.go +++ b/server/initialize/initialize.go @@ -1,16 +1,45 @@ package initialize import ( - dbInit "mayfly-go/internal/db/init" - machineInit "mayfly-go/internal/machine/init" "mayfly-go/pkg/biz" "mayfly-go/pkg/ioc" ) -func InitOther() { - // 为所有注册的实例注入其依赖的其他组件实例 - biz.ErrIsNil(ioc.DefaultContainer.InjectComponents()) +// 初始化ioc函数 +type InitIocFunc func() - machineInit.Init() - dbInit.Init() +// 初始化函数 +type InitFunc func() + +var ( + initIocFuncs = make([]InitIocFunc, 0) + initFuncs = make([]InitFunc, 0) +) + +// 添加初始化ioc函数,由各个默认自行添加 +func AddInitIocFunc(initIocFunc InitIocFunc) { + initIocFuncs = append(initIocFuncs, initIocFunc) +} + +// 添加初始化函数,由各个默认自行添加 +func AddInitFunc(initFunc InitFunc) { + initFuncs = append(initFuncs, initFunc) +} + +// 系统启动时,调用各个模块的初始化函数 +func InitOther() { + // 调用各个默认ioc组件注册初始化,优先调用ioc初始化注册函数和注入函数(可能在后续的InitFunc中需要用到依赖实例) + for _, initIocFunc := range initIocFuncs { + initIocFunc() + } + initIocFuncs = nil + + // 为所有注册的实例注入其依赖的其他组件实例 + biz.ErrIsNil(ioc.InjectComponents()) + + // 调用各个默认的初始化函数 + for _, initFunc := range initFuncs { + initFunc() + } + initFuncs = nil } diff --git a/server/initialize/router.go b/server/initialize/router.go index 27b80b05..cfbb8a2d 100644 --- a/server/initialize/router.go +++ b/server/initialize/router.go @@ -3,15 +3,6 @@ package initialize import ( "fmt" "io/fs" - auth_router "mayfly-go/internal/auth/router" - common_router "mayfly-go/internal/common/router" - db_router "mayfly-go/internal/db/router" - machine_router "mayfly-go/internal/machine/router" - mongo_router "mayfly-go/internal/mongo/router" - msg_router "mayfly-go/internal/msg/router" - redis_router "mayfly-go/internal/redis/router" - sys_router "mayfly-go/internal/sys/router" - tag_router "mayfly-go/internal/tag/router" "mayfly-go/pkg/config" "mayfly-go/pkg/middleware" "mayfly-go/static" @@ -20,6 +11,18 @@ import ( "github.com/gin-gonic/gin" ) +// 初始化路由函数 +type InitRouterFunc func(router *gin.RouterGroup) + +var ( + initRouterFuncs = make([]InitRouterFunc, 0) +) + +// 添加初始化路由函数,由各个默认自行添加 +func AddInitRouterFunc(initRouterFunc InitRouterFunc) { + initRouterFuncs = append(initRouterFuncs, initRouterFunc) +} + func InitRouter() *gin.Engine { // server配置 serverConfig := config.Conf.Server @@ -43,20 +46,11 @@ func InitRouter() *gin.Engine { // 设置路由组 api := router.Group(serverConfig.ContextPath + "/api") - { - common_router.Init(api) - - auth_router.Init(api) - - sys_router.Init(api) - msg_router.Init(api) - - tag_router.Init(api) - machine_router.Init(api) - db_router.Init(api) - redis_router.Init(api) - mongo_router.Init(api) + // 调用所有模块注册的初始化路由函数 + for _, initRouterFunc := range initRouterFuncs { + initRouterFunc(api) } + initRouterFuncs = nil return router } diff --git a/server/initialize/savelog.go b/server/initialize/savelog.go deleted file mode 100644 index a1dcdb06..00000000 --- a/server/initialize/savelog.go +++ /dev/null @@ -1,10 +0,0 @@ -package initialize - -import ( - sysapp "mayfly-go/internal/sys/application" - "mayfly-go/pkg/req" -) - -func InitSaveLogFunc() req.SaveLogFunc { - return sysapp.GetSyslogApp().SaveFromReq -} diff --git a/server/initialize/terminate.go b/server/initialize/terminate.go index 20b4c489..27ebec52 100644 --- a/server/initialize/terminate.go +++ b/server/initialize/terminate.go @@ -1,10 +1,20 @@ package initialize -import ( - dbInit "mayfly-go/internal/db/init" +// 系统进程退出终止函数 +type TerminateFunc func() + +var ( + terminateFuncs = make([]TerminateFunc, 0) ) +// 添加系统退出终止时执行的函数,由各个默认自行添加 +func AddTerminateFunc(terminateFunc TerminateFunc) { + terminateFuncs = append(terminateFuncs, terminateFunc) +} + // 终止进程服务后的一些操作 func Terminate() { - dbInit.Terminate() + for _, terminateFunc := range terminateFuncs { + terminateFunc() + } } diff --git a/server/internal/auth/application/application.go b/server/internal/auth/application/application.go index 1b75f87b..13a68221 100644 --- a/server/internal/auth/application/application.go +++ b/server/internal/auth/application/application.go @@ -5,7 +5,7 @@ import ( "mayfly-go/pkg/ioc" ) -func init() { +func InitIoc() { persistence.Init() ioc.Register(new(oauth2AppImpl), ioc.WithComponentName("Oauth2App")) diff --git a/server/internal/auth/init/init.go b/server/internal/auth/init/init.go new file mode 100644 index 00000000..11855927 --- /dev/null +++ b/server/internal/auth/init/init.go @@ -0,0 +1,12 @@ +package init + +import ( + "mayfly-go/initialize" + "mayfly-go/internal/auth/application" + "mayfly-go/internal/auth/router" +) + +func init() { + initialize.AddInitIocFunc(application.InitIoc) + initialize.AddInitRouterFunc(router.Init) +} diff --git a/server/internal/common/init/init.go b/server/internal/common/init/init.go new file mode 100644 index 00000000..49d0628f --- /dev/null +++ b/server/internal/common/init/init.go @@ -0,0 +1,10 @@ +package init + +import ( + "mayfly-go/initialize" + "mayfly-go/internal/common/router" +) + +func init() { + initialize.AddInitRouterFunc(router.Init) +} diff --git a/server/internal/db/application/application.go b/server/internal/db/application/application.go index 44778cf2..49704506 100644 --- a/server/internal/db/application/application.go +++ b/server/internal/db/application/application.go @@ -14,7 +14,7 @@ var ( dbBinlogApp *DbBinlogApp ) -func init() { +func InitIoc() { persistence.Init() ioc.Register(new(instanceAppImpl), ioc.WithComponentName("DbInstanceApp")) diff --git a/server/internal/db/init/init.go b/server/internal/db/init/init.go index 0b00e08f..7d50512a 100644 --- a/server/internal/db/init/init.go +++ b/server/internal/db/init/init.go @@ -1,7 +1,14 @@ package init -import "mayfly-go/internal/db/application" +import ( + "mayfly-go/initialize" + "mayfly-go/internal/db/application" + "mayfly-go/internal/db/router" +) -func Init() { - application.Init() +func init() { + initialize.AddInitIocFunc(application.InitIoc) + initialize.AddInitRouterFunc(router.Init) + initialize.AddInitFunc(application.Init) + initialize.AddTerminateFunc(Terminate) } diff --git a/server/internal/machine/application/application.go b/server/internal/machine/application/application.go index 31147c4a..40cb812b 100644 --- a/server/internal/machine/application/application.go +++ b/server/internal/machine/application/application.go @@ -5,7 +5,7 @@ import ( "mayfly-go/pkg/ioc" ) -func init() { +func InitIoc() { persistence.Init() ioc.Register(new(machineAppImpl), ioc.WithComponentName("MachineApp")) diff --git a/server/internal/machine/init/init.go b/server/internal/machine/init/init.go index 01497dc6..3c971f93 100644 --- a/server/internal/machine/init/init.go +++ b/server/internal/machine/init/init.go @@ -2,13 +2,21 @@ package init import ( "context" + "mayfly-go/initialize" "mayfly-go/internal/common/consts" "mayfly-go/internal/machine/application" "mayfly-go/internal/machine/domain/entity" + "mayfly-go/internal/machine/router" "mayfly-go/pkg/eventbus" "mayfly-go/pkg/global" ) +func init() { + initialize.AddInitIocFunc(application.InitIoc) + initialize.AddInitRouterFunc(router.Init) + initialize.AddInitFunc(Init) +} + func Init() { application.GetMachineCronJobApp().InitCronJob() diff --git a/server/internal/mongo/application/application.go b/server/internal/mongo/application/application.go index efe4fb7c..6c4bfee9 100644 --- a/server/internal/mongo/application/application.go +++ b/server/internal/mongo/application/application.go @@ -5,7 +5,7 @@ import ( "mayfly-go/pkg/ioc" ) -func init() { +func InitIoc() { persistence.Init() ioc.Register(new(mongoAppImpl), ioc.WithComponentName("MongoApp")) diff --git a/server/internal/mongo/init/init.go b/server/internal/mongo/init/init.go new file mode 100644 index 00000000..03072e8f --- /dev/null +++ b/server/internal/mongo/init/init.go @@ -0,0 +1,12 @@ +package init + +import ( + "mayfly-go/initialize" + "mayfly-go/internal/mongo/application" + "mayfly-go/internal/mongo/router" +) + +func init() { + initialize.AddInitIocFunc(application.InitIoc) + initialize.AddInitRouterFunc(router.Init) +} diff --git a/server/internal/msg/application/application.go b/server/internal/msg/application/application.go index e50923b7..be082150 100644 --- a/server/internal/msg/application/application.go +++ b/server/internal/msg/application/application.go @@ -5,7 +5,7 @@ import ( "mayfly-go/pkg/ioc" ) -func init() { +func InitIoc() { persistence.Init() ioc.Register(new(msgAppImpl), ioc.WithComponentName("MsgApp")) diff --git a/server/internal/msg/init/init.go b/server/internal/msg/init/init.go new file mode 100644 index 00000000..d1e40137 --- /dev/null +++ b/server/internal/msg/init/init.go @@ -0,0 +1,12 @@ +package init + +import ( + "mayfly-go/initialize" + "mayfly-go/internal/msg/application" + "mayfly-go/internal/msg/router" +) + +func init() { + initialize.AddInitIocFunc(application.InitIoc) + initialize.AddInitRouterFunc(router.Init) +} diff --git a/server/internal/redis/application/application.go b/server/internal/redis/application/application.go index 338ab59f..50662b00 100644 --- a/server/internal/redis/application/application.go +++ b/server/internal/redis/application/application.go @@ -5,7 +5,7 @@ import ( "mayfly-go/pkg/ioc" ) -func init() { +func InitIoc() { persistence.Init() ioc.Register(new(redisAppImpl), ioc.WithComponentName("RedisApp")) diff --git a/server/internal/redis/init/init.go b/server/internal/redis/init/init.go new file mode 100644 index 00000000..55ca2aa2 --- /dev/null +++ b/server/internal/redis/init/init.go @@ -0,0 +1,12 @@ +package init + +import ( + "mayfly-go/initialize" + "mayfly-go/internal/redis/application" + "mayfly-go/internal/redis/router" +) + +func init() { + initialize.AddInitIocFunc(application.InitIoc) + initialize.AddInitRouterFunc(router.Init) +} diff --git a/server/internal/sys/application/application.go b/server/internal/sys/application/application.go index e5894f4c..029c7b39 100644 --- a/server/internal/sys/application/application.go +++ b/server/internal/sys/application/application.go @@ -5,7 +5,7 @@ import ( "mayfly-go/pkg/ioc" ) -func init() { +func InitIoc() { persistence.Init() ioc.Register(new(accountAppImpl), ioc.WithComponentName("AccountApp")) diff --git a/server/internal/sys/init/init.go b/server/internal/sys/init/init.go new file mode 100644 index 00000000..30e27c89 --- /dev/null +++ b/server/internal/sys/init/init.go @@ -0,0 +1,12 @@ +package init + +import ( + "mayfly-go/initialize" + "mayfly-go/internal/sys/application" + "mayfly-go/internal/sys/router" +) + +func init() { + initialize.AddInitIocFunc(application.InitIoc) + initialize.AddInitRouterFunc(router.Init) +} diff --git a/server/internal/tag/application/application.go b/server/internal/tag/application/application.go index 70db4718..8847cc86 100644 --- a/server/internal/tag/application/application.go +++ b/server/internal/tag/application/application.go @@ -5,7 +5,7 @@ import ( "mayfly-go/pkg/ioc" ) -func init() { +func InitIoc() { persistence.Init() ioc.Register(new(tagTreeAppImpl), ioc.WithComponentName("TagTreeApp")) diff --git a/server/internal/tag/init/init.go b/server/internal/tag/init/init.go new file mode 100644 index 00000000..c62b95a5 --- /dev/null +++ b/server/internal/tag/init/init.go @@ -0,0 +1,12 @@ +package init + +import ( + "mayfly-go/initialize" + "mayfly-go/internal/tag/application" + "mayfly-go/internal/tag/router" +) + +func init() { + initialize.AddInitIocFunc(application.InitIoc) + initialize.AddInitRouterFunc(router.Init) +} diff --git a/server/main.go b/server/main.go index 4c92a0d0..26fccac0 100644 --- a/server/main.go +++ b/server/main.go @@ -1,6 +1,15 @@ package main import ( + _ "mayfly-go/internal/auth/init" + _ "mayfly-go/internal/common/init" + _ "mayfly-go/internal/db/init" + _ "mayfly-go/internal/machine/init" + _ "mayfly-go/internal/mongo/init" + _ "mayfly-go/internal/msg/init" + _ "mayfly-go/internal/redis/init" + _ "mayfly-go/internal/sys/init" + _ "mayfly-go/internal/tag/init" "mayfly-go/pkg/starter" ) diff --git a/server/pkg/ioc/default.go b/server/pkg/ioc/default.go index 639c89d6..343ba28e 100644 --- a/server/pkg/ioc/default.go +++ b/server/pkg/ioc/default.go @@ -18,3 +18,8 @@ func Get[T any](name string) T { func Inject(component any) error { return DefaultContainer.Inject(component) } + +// 注入默认ioc容器内组件所依赖的其他组件实例 +func InjectComponents() error { + return DefaultContainer.InjectComponents() +} diff --git a/server/pkg/ioc/ioc.go b/server/pkg/ioc/ioc.go index 16d476c7..34e29478 100644 --- a/server/pkg/ioc/ioc.go +++ b/server/pkg/ioc/ioc.go @@ -28,7 +28,7 @@ func (c *Container) Register(bean any, opts ...ComponentOption) { cType := structx.IndirectType(reflect.TypeOf(component.Value)) // 组件名为空,则去组件类型名称作为组件名 if componentName == "" { - componentName := cType.Name() + componentName = cType.Name() component.Name = componentName } @@ -43,6 +43,10 @@ func (c *Container) Register(bean any, opts ...ComponentOption) { // 注册对象实例的字段含有inject:"xxx"标签或者Setter方法,则注入对应组件实例 func (c *Container) Inject(obj any) error { objValue := reflect.ValueOf(obj) + if structx.Indirect(objValue).Kind() != reflect.Struct { + return nil + } + if err := c.injectWithField(objValue); err != nil { return err } diff --git a/server/pkg/ioc/ioc_test.go b/server/pkg/ioc/ioc_test.go new file mode 100644 index 00000000..9e47995c --- /dev/null +++ b/server/pkg/ioc/ioc_test.go @@ -0,0 +1,62 @@ +package ioc + +import ( + "testing" +) + +type UserApp struct { + UserRepo *UserRepo `inject:""` // inject=""则默认使用字段名作为组件名进行查找并注入 + + sysRepo *SysRepo +} + +// 通过Inject开头函数注入,组件名为去除Inject字符串后的其余字符串,即SysRepo +func (u *UserApp) InjectSysRepo(sr *SysRepo) { + u.sysRepo = sr +} + +type UserRepo struct { + Name string `inject:"username"` +} + +type SysRepo struct { + Name string `inject:"sysname"` +} + +func TestInject(t *testing.T) { + Register("哈哈哈", WithComponentName("username")) + Register("呵呵呵", WithComponentName("sysname")) + + userRepo := &UserRepo{} + Register(userRepo) + + sysRepo := new(SysRepo) + Register(sysRepo) + + userApp := new(UserApp) + Register(userApp) + + if err := InjectComponents(); err != nil { + println(err.Error()) + } + println(userApp) +} + +func TestInjectWithCname(t *testing.T) { + Register("哈哈哈", WithComponentName("username")) + Register("呵呵呵", WithComponentName("sysname")) + + userRepo := &UserRepo{} + Register(userRepo, WithComponentName("UserRepo")) + + userApp := new(UserApp) + Register(userApp) + + sysRepo := new(SysRepo) + Register(sysRepo, WithComponentName("SysRepo")) + + if err := InjectComponents(); err != nil { + println(err.Error()) + } + println(userApp) +} diff --git a/server/pkg/starter/web-server.go b/server/pkg/starter/web-server.go index 87f54cb9..99744165 100644 --- a/server/pkg/starter/web-server.go +++ b/server/pkg/starter/web-server.go @@ -10,6 +10,8 @@ import ( "net/http" "time" + sysapp "mayfly-go/internal/sys/application" + "github.com/gin-gonic/gin" ) @@ -24,7 +26,7 @@ func runWebServer(ctx context.Context) { // 日志处理器 req.UseAfterHandlerInterceptor(req.LogHandler) // 设置日志保存函数 - req.SetSaveLogFunc(initialize.InitSaveLogFunc()) + req.SetSaveLogFunc(sysapp.GetSyslogApp().SaveFromReq) srv := http.Server{ Addr: config.Conf.Server.GetPort(),