mirror of
https://gitee.com/dromara/mayfly-go
synced 2025-11-02 15:30:25 +08:00
refactor: ioc与系统初始化处理方式调整
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"mayfly-go/pkg/ioc"
|
||||
)
|
||||
|
||||
func init() {
|
||||
func InitIoc() {
|
||||
persistence.Init()
|
||||
|
||||
ioc.Register(new(oauth2AppImpl), ioc.WithComponentName("Oauth2App"))
|
||||
|
||||
12
server/internal/auth/init/init.go
Normal file
12
server/internal/auth/init/init.go
Normal file
@@ -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)
|
||||
}
|
||||
10
server/internal/common/init/init.go
Normal file
10
server/internal/common/init/init.go
Normal file
@@ -0,0 +1,10 @@
|
||||
package init
|
||||
|
||||
import (
|
||||
"mayfly-go/initialize"
|
||||
"mayfly-go/internal/common/router"
|
||||
)
|
||||
|
||||
func init() {
|
||||
initialize.AddInitRouterFunc(router.Init)
|
||||
}
|
||||
@@ -14,7 +14,7 @@ var (
|
||||
dbBinlogApp *DbBinlogApp
|
||||
)
|
||||
|
||||
func init() {
|
||||
func InitIoc() {
|
||||
persistence.Init()
|
||||
|
||||
ioc.Register(new(instanceAppImpl), ioc.WithComponentName("DbInstanceApp"))
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"mayfly-go/pkg/ioc"
|
||||
)
|
||||
|
||||
func init() {
|
||||
func InitIoc() {
|
||||
persistence.Init()
|
||||
|
||||
ioc.Register(new(machineAppImpl), ioc.WithComponentName("MachineApp"))
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"mayfly-go/pkg/ioc"
|
||||
)
|
||||
|
||||
func init() {
|
||||
func InitIoc() {
|
||||
persistence.Init()
|
||||
|
||||
ioc.Register(new(mongoAppImpl), ioc.WithComponentName("MongoApp"))
|
||||
|
||||
12
server/internal/mongo/init/init.go
Normal file
12
server/internal/mongo/init/init.go
Normal file
@@ -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)
|
||||
}
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"mayfly-go/pkg/ioc"
|
||||
)
|
||||
|
||||
func init() {
|
||||
func InitIoc() {
|
||||
persistence.Init()
|
||||
|
||||
ioc.Register(new(msgAppImpl), ioc.WithComponentName("MsgApp"))
|
||||
|
||||
12
server/internal/msg/init/init.go
Normal file
12
server/internal/msg/init/init.go
Normal file
@@ -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)
|
||||
}
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"mayfly-go/pkg/ioc"
|
||||
)
|
||||
|
||||
func init() {
|
||||
func InitIoc() {
|
||||
persistence.Init()
|
||||
|
||||
ioc.Register(new(redisAppImpl), ioc.WithComponentName("RedisApp"))
|
||||
|
||||
12
server/internal/redis/init/init.go
Normal file
12
server/internal/redis/init/init.go
Normal file
@@ -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)
|
||||
}
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"mayfly-go/pkg/ioc"
|
||||
)
|
||||
|
||||
func init() {
|
||||
func InitIoc() {
|
||||
persistence.Init()
|
||||
|
||||
ioc.Register(new(accountAppImpl), ioc.WithComponentName("AccountApp"))
|
||||
|
||||
12
server/internal/sys/init/init.go
Normal file
12
server/internal/sys/init/init.go
Normal file
@@ -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)
|
||||
}
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"mayfly-go/pkg/ioc"
|
||||
)
|
||||
|
||||
func init() {
|
||||
func InitIoc() {
|
||||
persistence.Init()
|
||||
|
||||
ioc.Register(new(tagTreeAppImpl), ioc.WithComponentName("TagTreeApp"))
|
||||
|
||||
12
server/internal/tag/init/init.go
Normal file
12
server/internal/tag/init/init.go
Normal file
@@ -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)
|
||||
}
|
||||
@@ -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"
|
||||
)
|
||||
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
62
server/pkg/ioc/ioc_test.go
Normal file
62
server/pkg/ioc/ioc_test.go
Normal file
@@ -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)
|
||||
}
|
||||
@@ -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(),
|
||||
|
||||
Reference in New Issue
Block a user