refactor: ioc与系统初始化处理方式调整

This commit is contained in:
meilin.huang
2024-01-22 11:35:28 +08:00
parent de5b9e46d3
commit 9efd20f1b9
26 changed files with 257 additions and 55 deletions

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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()
}
}

View File

@@ -5,7 +5,7 @@ import (
"mayfly-go/pkg/ioc"
)
func init() {
func InitIoc() {
persistence.Init()
ioc.Register(new(oauth2AppImpl), ioc.WithComponentName("Oauth2App"))

View 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)
}

View File

@@ -0,0 +1,10 @@
package init
import (
"mayfly-go/initialize"
"mayfly-go/internal/common/router"
)
func init() {
initialize.AddInitRouterFunc(router.Init)
}

View File

@@ -14,7 +14,7 @@ var (
dbBinlogApp *DbBinlogApp
)
func init() {
func InitIoc() {
persistence.Init()
ioc.Register(new(instanceAppImpl), ioc.WithComponentName("DbInstanceApp"))

View File

@@ -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)
}

View File

@@ -5,7 +5,7 @@ import (
"mayfly-go/pkg/ioc"
)
func init() {
func InitIoc() {
persistence.Init()
ioc.Register(new(machineAppImpl), ioc.WithComponentName("MachineApp"))

View File

@@ -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()

View File

@@ -5,7 +5,7 @@ import (
"mayfly-go/pkg/ioc"
)
func init() {
func InitIoc() {
persistence.Init()
ioc.Register(new(mongoAppImpl), ioc.WithComponentName("MongoApp"))

View 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)
}

View File

@@ -5,7 +5,7 @@ import (
"mayfly-go/pkg/ioc"
)
func init() {
func InitIoc() {
persistence.Init()
ioc.Register(new(msgAppImpl), ioc.WithComponentName("MsgApp"))

View 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)
}

View File

@@ -5,7 +5,7 @@ import (
"mayfly-go/pkg/ioc"
)
func init() {
func InitIoc() {
persistence.Init()
ioc.Register(new(redisAppImpl), ioc.WithComponentName("RedisApp"))

View 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)
}

View File

@@ -5,7 +5,7 @@ import (
"mayfly-go/pkg/ioc"
)
func init() {
func InitIoc() {
persistence.Init()
ioc.Register(new(accountAppImpl), ioc.WithComponentName("AccountApp"))

View 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)
}

View File

@@ -5,7 +5,7 @@ import (
"mayfly-go/pkg/ioc"
)
func init() {
func InitIoc() {
persistence.Init()
ioc.Register(new(tagTreeAppImpl), ioc.WithComponentName("TagTreeApp"))

View 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)
}

View File

@@ -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"
)

View File

@@ -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()
}

View File

@@ -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
}

View 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)
}

View File

@@ -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(),