From f27d3d200f61ace0b8f2887731e3029b54f813cc Mon Sep 17 00:00:00 2001 From: "meilin.huang" <954537473@qq.com> Date: Sun, 21 Jan 2024 22:52:20 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E7=AE=80=E6=98=93?= =?UTF-8?q?=E7=89=88ioc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mayfly_go_web/package.json | 3 +- mayfly_go_web/src/common/config.ts | 2 +- mayfly_go_web/vite.config.ts | 8 +- server/initialize/initialize.go | 5 + server/internal/auth/api/account_login.go | 4 +- server/internal/auth/api/ldap_login.go | 4 +- server/internal/auth/api/oauth2_login.go | 6 +- .../internal/auth/application/application.go | 17 +- server/internal/auth/application/oauth2.go | 16 +- .../infrastructure/persistence/persistence.go | 15 +- server/internal/auth/router/router.go | 24 +-- server/internal/common/api/index.go | 10 +- server/internal/common/router/index.go | 16 +- server/internal/db/api/db.go | 10 +- server/internal/db/api/db_data_sync.go | 2 +- server/internal/db/api/db_sql.go | 2 +- server/internal/db/api/db_sql_exec.go | 2 +- server/internal/db/api/instance.go | 4 +- server/internal/db/application/application.go | 37 ++-- server/internal/db/application/db.go | 35 ++-- .../internal/db/application/db_data_sync.go | 17 +- .../internal/db/application/db_scheduler.go | 2 +- server/internal/db/application/db_sql.go | 7 +- server/internal/db/application/db_sql_exec.go | 16 +- server/internal/db/application/instance.go | 11 +- .../infrastructure/persistence/persistence.go | 41 ++--- server/internal/db/router/db.go | 14 +- server/internal/db/router/db_data_sync.go | 8 +- server/internal/db/router/db_sql.go | 8 +- server/internal/db/router/db_sql_exec.go | 8 +- server/internal/db/router/instance.go | 9 +- server/internal/machine/api/auth_cert.go | 2 +- server/internal/machine/api/machine.go | 6 +- .../internal/machine/api/machine_cronjob.go | 2 +- server/internal/machine/api/machine_file.go | 4 +- server/internal/machine/api/machine_script.go | 6 +- .../machine/application/application.go | 50 ++---- .../internal/machine/application/auth_cert.go | 11 +- .../internal/machine/application/machine.go | 30 ++-- .../machine/application/machine_cronjob.go | 80 ++++----- .../machine/application/machine_file.go | 26 ++- .../machine/application/machine_script.go | 15 +- .../machine/application/machine_term_op.go | 11 +- .../persistence/machine_cronjob.go | 6 +- .../persistence/machine_cronjob_relate.go | 12 +- .../infrastructure/persistence/persistence.go | 41 ++--- server/internal/machine/router/auth_cert.go | 8 +- server/internal/machine/router/machine.go | 11 +- .../machine/router/machine_cronjob.go | 9 +- .../internal/machine/router/machine_file.go | 10 +- .../internal/machine/router/machine_script.go | 12 +- server/internal/mongo/api/mongo.go | 4 +- .../internal/mongo/application/application.go | 12 +- server/internal/mongo/application/mongo.go | 23 ++- .../infrastructure/persistence/persistence.go | 9 +- server/internal/mongo/router/mongo.go | 10 +- server/internal/msg/api/msg.go | 2 +- .../internal/msg/application/application.go | 11 +- server/internal/msg/application/msg.go | 14 +- .../infrastructure/persistence/persistence.go | 15 +- server/internal/msg/router/msg.go | 8 +- server/internal/msg/router/router.go | 4 +- server/internal/redis/api/hash.go | 2 +- server/internal/redis/api/list.go | 2 +- server/internal/redis/api/redis.go | 4 +- server/internal/redis/api/set.go | 2 +- server/internal/redis/api/string.go | 2 +- .../internal/redis/application/application.go | 12 +- server/internal/redis/application/redis.go | 23 ++- .../infrastructure/persistence/persistence.go | 15 +- server/internal/redis/router/redis.go | 18 +- server/internal/sys/api/account.go | 10 +- server/internal/sys/api/config.go | 2 +- server/internal/sys/api/resource.go | 2 +- server/internal/sys/api/role.go | 4 +- server/internal/sys/api/syslog.go | 2 +- server/internal/sys/application/account.go | 9 +- .../internal/sys/application/application.go | 27 +-- server/internal/sys/application/config.go | 11 +- server/internal/sys/application/resource.go | 11 +- server/internal/sys/application/role.go | 37 ++-- server/internal/sys/application/syslog.go | 12 +- .../sys/infrastructure/persistence/account.go | 6 +- .../infrastructure/persistence/persistence.go | 33 ++-- server/internal/sys/router/account.go | 13 +- server/internal/sys/router/config.go | 6 +- server/internal/sys/router/resource.go | 6 +- server/internal/sys/router/role.go | 9 +- server/internal/sys/router/router.go | 4 +- server/internal/sys/router/syslog.go | 8 +- server/internal/sys/router/system.go | 5 +- server/internal/tag/api/tag_tree.go | 4 +- server/internal/tag/api/team.go | 8 +- .../internal/tag/application/application.go | 27 ++- .../internal/tag/application/tag_resource.go | 11 +- server/internal/tag/application/tag_tree.go | 41 ++--- server/internal/tag/application/team.go | 47 ++---- .../infrastructure/persistence/persistence.go | 29 ++-- server/internal/tag/router/tag_tree.go | 9 +- server/internal/tag/router/team.go | 11 +- server/pkg/config/app.go | 2 +- server/pkg/ioc/component.go | 28 +++ server/pkg/ioc/default.go | 20 +++ server/pkg/ioc/ioc.go | 159 ++++++++++++++++++ server/resources/data/mayfly-go.sqlite | Bin 327680 -> 225280 bytes server/resources/script/sql/mayfly-go.sql | 2 +- 106 files changed, 815 insertions(+), 707 deletions(-) create mode 100644 server/pkg/ioc/component.go create mode 100644 server/pkg/ioc/default.go create mode 100644 server/pkg/ioc/ioc.go diff --git a/mayfly_go_web/package.json b/mayfly_go_web/package.json index 07299e49..d3709965 100644 --- a/mayfly_go_web/package.json +++ b/mayfly_go_web/package.json @@ -49,13 +49,14 @@ "@typescript-eslint/parser": "^6.7.4", "@vitejs/plugin-vue": "^5.0.3", "@vue/compiler-sfc": "^3.4.14", + "code-inspector-plugin": "^0.4.5", "dotenv": "^16.3.1", "eslint": "^8.35.0", "eslint-plugin-vue": "^9.19.2", "prettier": "^3.1.0", "sass": "^1.69.0", "typescript": "^5.3.2", - "vite": "^5.0.11", + "vite": "^5.0.12", "vue-eslint-parser": "^9.4.0" }, "browserslist": [ diff --git a/mayfly_go_web/src/common/config.ts b/mayfly_go_web/src/common/config.ts index 12781412..92770733 100644 --- a/mayfly_go_web/src/common/config.ts +++ b/mayfly_go_web/src/common/config.ts @@ -15,7 +15,7 @@ const config = { baseWsUrl: `${(window as any).globalConfig.BaseWsUrl || `${location.protocol == 'https:' ? 'wss:' : 'ws:'}//${getBaseApiUrl()}`}/api`, // 系统版本 - version: 'v1.7.0', + version: 'v1.7.1', }; export default config; diff --git a/mayfly_go_web/vite.config.ts b/mayfly_go_web/vite.config.ts index 7275857f..17a20c10 100644 --- a/mayfly_go_web/vite.config.ts +++ b/mayfly_go_web/vite.config.ts @@ -2,6 +2,7 @@ import vue from '@vitejs/plugin-vue'; import { resolve } from 'path'; import type { UserConfig } from 'vite'; import { loadEnv } from './src/common/utils/viteBuild'; +import { CodeInspectorPlugin } from 'code-inspector-plugin'; const pathResolve = (dir: string): any => { return resolve(__dirname, '.', dir); @@ -14,7 +15,12 @@ const alias: Record = { }; const viteConfig: UserConfig = { - plugins: [vue()], + plugins: [ + vue(), + CodeInspectorPlugin({ + bundler: 'vite', + }), + ], root: process.cwd(), resolve: { alias, diff --git a/server/initialize/initialize.go b/server/initialize/initialize.go index aab78c43..03f9beb6 100644 --- a/server/initialize/initialize.go +++ b/server/initialize/initialize.go @@ -3,9 +3,14 @@ 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()) + machineInit.Init() dbInit.Init() } diff --git a/server/internal/auth/api/account_login.go b/server/internal/auth/api/account_login.go index 6663d115..d8b8299e 100644 --- a/server/internal/auth/api/account_login.go +++ b/server/internal/auth/api/account_login.go @@ -25,8 +25,8 @@ import ( ) type AccountLogin struct { - AccountApp sysapp.Account - MsgApp msgapp.Msg + AccountApp sysapp.Account `inject:""` + MsgApp msgapp.Msg `inject:""` } /** 用户账号密码登录 **/ diff --git a/server/internal/auth/api/ldap_login.go b/server/internal/auth/api/ldap_login.go index e672044a..9c325a51 100644 --- a/server/internal/auth/api/ldap_login.go +++ b/server/internal/auth/api/ldap_login.go @@ -28,8 +28,8 @@ import ( ) type LdapLogin struct { - AccountApp sysapp.Account - MsgApp msgapp.Msg + AccountApp sysapp.Account `inject:""` + MsgApp msgapp.Msg `inject:""` } // @router /auth/ldap/enabled [get] diff --git a/server/internal/auth/api/oauth2_login.go b/server/internal/auth/api/oauth2_login.go index 375a59c8..0c7dd77c 100644 --- a/server/internal/auth/api/oauth2_login.go +++ b/server/internal/auth/api/oauth2_login.go @@ -28,9 +28,9 @@ import ( ) type Oauth2Login struct { - Oauth2App application.Oauth2 - AccountApp sysapp.Account - MsgApp msgapp.Msg + Oauth2App application.Oauth2 `inject:""` + AccountApp sysapp.Account `inject:""` + MsgApp msgapp.Msg `inject:""` } func (a *Oauth2Login) OAuth2Login(rc *req.Ctx) { diff --git a/server/internal/auth/application/application.go b/server/internal/auth/application/application.go index ae6c935b..1b75f87b 100644 --- a/server/internal/auth/application/application.go +++ b/server/internal/auth/application/application.go @@ -1,11 +1,16 @@ package application -import "mayfly-go/internal/auth/infrastructure/persistence" - -var ( - authApp = newAuthApp(persistence.GetOauthAccountRepo()) +import ( + "mayfly-go/internal/auth/infrastructure/persistence" + "mayfly-go/pkg/ioc" ) -func GetAuthApp() Oauth2 { - return authApp +func init() { + persistence.Init() + + ioc.Register(new(oauth2AppImpl), ioc.WithComponentName("Oauth2App")) +} + +func GetAuthApp() Oauth2 { + return ioc.Get[Oauth2]("Oauth2App") } diff --git a/server/internal/auth/application/oauth2.go b/server/internal/auth/application/oauth2.go index 6f19b1fb..45d2fdbb 100644 --- a/server/internal/auth/application/oauth2.go +++ b/server/internal/auth/application/oauth2.go @@ -14,27 +14,21 @@ type Oauth2 interface { Unbind(accountId uint64) } -func newAuthApp(oauthAccountRepo repository.Oauth2Account) Oauth2 { - return &oauth2AppImpl{ - oauthAccountRepo: oauthAccountRepo, - } -} - type oauth2AppImpl struct { - oauthAccountRepo repository.Oauth2Account + Oauth2AccountRepo repository.Oauth2Account `inject:""` } func (a *oauth2AppImpl) GetOAuthAccount(condition *entity.Oauth2Account, cols ...string) error { - return a.oauthAccountRepo.GetBy(condition, cols...) + return a.Oauth2AccountRepo.GetBy(condition, cols...) } func (a *oauth2AppImpl) BindOAuthAccount(e *entity.Oauth2Account) error { if e.Id == 0 { - return a.oauthAccountRepo.Insert(context.Background(), e) + return a.Oauth2AccountRepo.Insert(context.Background(), e) } - return a.oauthAccountRepo.UpdateById(context.Background(), e) + return a.Oauth2AccountRepo.UpdateById(context.Background(), e) } func (a *oauth2AppImpl) Unbind(accountId uint64) { - a.oauthAccountRepo.DeleteByCond(context.Background(), &entity.Oauth2Account{AccountId: accountId}) + a.Oauth2AccountRepo.DeleteByCond(context.Background(), &entity.Oauth2Account{AccountId: accountId}) } diff --git a/server/internal/auth/infrastructure/persistence/persistence.go b/server/internal/auth/infrastructure/persistence/persistence.go index b3d00e80..6694bae1 100644 --- a/server/internal/auth/infrastructure/persistence/persistence.go +++ b/server/internal/auth/infrastructure/persistence/persistence.go @@ -1,11 +1,14 @@ package persistence -import "mayfly-go/internal/auth/domain/repository" - -var ( - authAccountRepo = newAuthAccountRepo() +import ( + "mayfly-go/internal/auth/domain/repository" + "mayfly-go/pkg/ioc" ) -func GetOauthAccountRepo() repository.Oauth2Account { - return authAccountRepo +func Init() { + ioc.Register(newAuthAccountRepo(), ioc.WithComponentName("Oauth2AccountRepo")) +} + +func GetOauthAccountRepo() repository.Oauth2Account { + return ioc.Get[repository.Oauth2Account]("Oauth2AccountRepo") } diff --git a/server/internal/auth/router/router.go b/server/internal/auth/router/router.go index 61b4597b..b377748f 100644 --- a/server/internal/auth/router/router.go +++ b/server/internal/auth/router/router.go @@ -2,30 +2,22 @@ package router import ( "mayfly-go/internal/auth/api" - "mayfly-go/internal/auth/application" - msgapp "mayfly-go/internal/msg/application" - sysapp "mayfly-go/internal/sys/application" + "mayfly-go/pkg/biz" + "mayfly-go/pkg/ioc" "mayfly-go/pkg/req" "github.com/gin-gonic/gin" ) func Init(router *gin.RouterGroup) { - accountLogin := &api.AccountLogin{ - AccountApp: sysapp.GetAccountApp(), - MsgApp: msgapp.GetMsgApp(), - } + accountLogin := new(api.AccountLogin) + biz.ErrIsNil(ioc.Inject(accountLogin)) - ldapLogin := &api.LdapLogin{ - AccountApp: sysapp.GetAccountApp(), - MsgApp: msgapp.GetMsgApp(), - } + ldapLogin := new(api.LdapLogin) + biz.ErrIsNil(ioc.Inject(ldapLogin)) - oauth2Login := &api.Oauth2Login{ - Oauth2App: application.GetAuthApp(), - AccountApp: sysapp.GetAccountApp(), - MsgApp: msgapp.GetMsgApp(), - } + oauth2Login := new(api.Oauth2Login) + biz.ErrIsNil(ioc.Inject(oauth2Login)) rg := router.Group("/auth") diff --git a/server/internal/common/api/index.go b/server/internal/common/api/index.go index 7b245801..f3853b92 100644 --- a/server/internal/common/api/index.go +++ b/server/internal/common/api/index.go @@ -12,11 +12,11 @@ import ( ) type Index struct { - TagApp tagapp.TagTree - MachineApp machineapp.Machine - DbApp dbapp.Db - RedisApp redisapp.Redis - MongoApp mongoapp.Mongo + TagApp tagapp.TagTree `inject:"TagTreeApp"` + MachineApp machineapp.Machine `inject:""` + DbApp dbapp.Db `inject:""` + RedisApp redisapp.Redis `inject:""` + MongoApp mongoapp.Mongo `inject:""` } func (i *Index) Count(rc *req.Ctx) { diff --git a/server/internal/common/router/index.go b/server/internal/common/router/index.go index d1ea32c0..b9f911cc 100644 --- a/server/internal/common/router/index.go +++ b/server/internal/common/router/index.go @@ -2,11 +2,8 @@ package router import ( "mayfly-go/internal/common/api" - dbapp "mayfly-go/internal/db/application" - machineapp "mayfly-go/internal/machine/application" - mongoapp "mayfly-go/internal/mongo/application" - redisapp "mayfly-go/internal/redis/application" - tagapp "mayfly-go/internal/tag/application" + "mayfly-go/pkg/biz" + "mayfly-go/pkg/ioc" "mayfly-go/pkg/req" "github.com/gin-gonic/gin" @@ -14,13 +11,8 @@ import ( func InitIndexRouter(router *gin.RouterGroup) { index := router.Group("common/index") - i := &api.Index{ - TagApp: tagapp.GetTagTreeApp(), - MachineApp: machineapp.GetMachineApp(), - DbApp: dbapp.GetDbApp(), - RedisApp: redisapp.GetRedisApp(), - MongoApp: mongoapp.GetMongoApp(), - } + i := new(api.Index) + biz.ErrIsNil(ioc.Inject(i)) { // 首页基本信息统计 req.NewGet("count", i.Count).Group(index) diff --git a/server/internal/db/api/db.go b/server/internal/db/api/db.go index 0811cb07..71f453a6 100644 --- a/server/internal/db/api/db.go +++ b/server/internal/db/api/db.go @@ -32,11 +32,11 @@ import ( ) type Db struct { - InstanceApp application.Instance - DbApp application.Db - DbSqlExecApp application.DbSqlExec - MsgApp msgapp.Msg - TagApp tagapp.TagTree + InstanceApp application.Instance `inject:"DbInstanceApp"` + DbApp application.Db `inject:""` + DbSqlExecApp application.DbSqlExec `inject:""` + MsgApp msgapp.Msg `inject:""` + TagApp tagapp.TagTree `inject:"TagTreeApp"` } // @router /api/dbs [get] diff --git a/server/internal/db/api/db_data_sync.go b/server/internal/db/api/db_data_sync.go index 8e178b74..735b86c4 100644 --- a/server/internal/db/api/db_data_sync.go +++ b/server/internal/db/api/db_data_sync.go @@ -19,7 +19,7 @@ import ( ) type DataSyncTask struct { - DataSyncTaskApp application.DataSyncTask + DataSyncTaskApp application.DataSyncTask `inject:"DbDataSyncTaskApp"` } func (d *DataSyncTask) Tasks(rc *req.Ctx) { diff --git a/server/internal/db/api/db_sql.go b/server/internal/db/api/db_sql.go index 90c1be7e..ef275f67 100644 --- a/server/internal/db/api/db_sql.go +++ b/server/internal/db/api/db_sql.go @@ -10,7 +10,7 @@ import ( ) type DbSql struct { - DbSqlApp application.DbSql + DbSqlApp application.DbSql `inject:""` } // @router /api/db/:dbId/sql [post] diff --git a/server/internal/db/api/db_sql_exec.go b/server/internal/db/api/db_sql_exec.go index cb77a710..584d7073 100644 --- a/server/internal/db/api/db_sql_exec.go +++ b/server/internal/db/api/db_sql_exec.go @@ -9,7 +9,7 @@ import ( ) type DbSqlExec struct { - DbSqlExecApp application.DbSqlExec + DbSqlExecApp application.DbSqlExec `inject:""` } func (d *DbSqlExec) DbSqlExecs(rc *req.Ctx) { diff --git a/server/internal/db/api/instance.go b/server/internal/db/api/instance.go index 84af750c..c0cb4159 100644 --- a/server/internal/db/api/instance.go +++ b/server/internal/db/api/instance.go @@ -16,8 +16,8 @@ import ( ) type Instance struct { - InstanceApp application.Instance - DbApp application.Db + InstanceApp application.Instance `inject:"DbInstanceApp"` + DbApp application.Db `inject:""` } // Instances 获取数据库实例信息 diff --git a/server/internal/db/application/application.go b/server/internal/db/application/application.go index 58a15de8..44778cf2 100644 --- a/server/internal/db/application/application.go +++ b/server/internal/db/application/application.go @@ -4,21 +4,26 @@ import ( "fmt" "mayfly-go/internal/db/domain/repository" "mayfly-go/internal/db/infrastructure/persistence" - tagapp "mayfly-go/internal/tag/application" + "mayfly-go/pkg/ioc" "sync" ) var ( - instanceApp Instance - dbApp Db - dbSqlExecApp DbSqlExec - dbSqlApp DbSql dbBackupApp *DbBackupApp dbRestoreApp *DbRestoreApp dbBinlogApp *DbBinlogApp - dataSyncApp DataSyncTask ) +func init() { + persistence.Init() + + ioc.Register(new(instanceAppImpl), ioc.WithComponentName("DbInstanceApp")) + ioc.Register(new(dbAppImpl), ioc.WithComponentName("DbApp")) + ioc.Register(new(dbSqlExecAppImpl), ioc.WithComponentName("DbSqlExecApp")) + ioc.Register(new(dbSqlAppImpl), ioc.WithComponentName("DbSqlApp")) + ioc.Register(new(dataSyncAppImpl), ioc.WithComponentName("DbDataSyncTaskApp")) +} + func Init() { sync.OnceFunc(func() { repositories := &repository.Repositories{ @@ -31,13 +36,7 @@ func Init() { BinlogHistory: persistence.NewDbBinlogHistoryRepo(), } var err error - instanceRepo := persistence.GetInstanceRepo() - instanceApp = newInstanceApp(instanceRepo) - dbApp = newDbApp(persistence.GetDbRepo(), persistence.GetDbSqlRepo(), instanceApp, tagapp.GetTagTreeApp()) - dbSqlExecApp = newDbSqlExecApp(persistence.GetDbSqlExecRepo()) - dbSqlApp = newDbSqlApp(persistence.GetDbSqlRepo()) - dataSyncApp = newDataSyncApp(persistence.GetDataSyncTaskRepo(), persistence.GetDataSyncLogRepo()) - + dbApp := GetDbApp() scheduler, err := newDbScheduler(repositories) if err != nil { panic(fmt.Sprintf("初始化 dbScheduler 失败: %v", err)) @@ -55,24 +54,24 @@ func Init() { panic(fmt.Sprintf("初始化 dbBinlogApp 失败: %v", err)) } - dataSyncApp.InitCronJob() + GetDataSyncTaskApp().InitCronJob() })() } func GetInstanceApp() Instance { - return instanceApp + return ioc.Get[Instance]("DbInstance") } func GetDbApp() Db { - return dbApp + return ioc.Get[Db]("DbApp") } func GetDbSqlApp() DbSql { - return dbSqlApp + return ioc.Get[DbSql]("DbSqlApp") } func GetDbSqlExecApp() DbSqlExec { - return dbSqlExecApp + return ioc.Get[DbSqlExec]("DbSqlExecApp") } func GetDbBackupApp() *DbBackupApp { @@ -88,5 +87,5 @@ func GetDbBinlogApp() *DbBinlogApp { } func GetDataSyncTaskApp() DataSyncTask { - return dataSyncApp + return ioc.Get[DataSyncTask]("DbDataSyncTaskApp") } diff --git a/server/internal/db/application/db.go b/server/internal/db/application/db.go index 4dae88ab..8391af63 100644 --- a/server/internal/db/application/db.go +++ b/server/internal/db/application/db.go @@ -40,22 +40,17 @@ type Db interface { GetDbConnByInstanceId(instanceId uint64) (*dbi.DbConn, error) } -func newDbApp(dbRepo repository.Db, dbSqlRepo repository.DbSql, dbInstanceApp Instance, tagApp tagapp.TagTree) Db { - app := &dbAppImpl{ - dbSqlRepo: dbSqlRepo, - dbInstanceApp: dbInstanceApp, - tagApp: tagApp, - } - app.Repo = dbRepo - return app -} - type dbAppImpl struct { base.AppImpl[*entity.Db, repository.Db] - dbSqlRepo repository.DbSql - dbInstanceApp Instance - tagApp tagapp.TagTree + DbSqlRepo repository.DbSql `inject:""` + DbInstanceApp Instance `inject:""` + TagApp tagapp.TagTree `inject:"TagTreeApp"` +} + +// 注入DbRepo +func (d *dbAppImpl) InjectDbRepo(repo repository.Db) { + d.Repo = repo } // 分页获取数据库信息列表 @@ -83,7 +78,7 @@ func (d *dbAppImpl) SaveDb(ctx context.Context, dbEntity *entity.Db, tagIds ...u return d.Tx(ctx, func(ctx context.Context) error { return d.Insert(ctx, dbEntity) }, func(ctx context.Context) error { - return d.tagApp.RelateResource(ctx, resouceCode, consts.TagResourceTypeDb, tagIds) + return d.TagApp.RelateResource(ctx, resouceCode, consts.TagResourceTypeDb, tagIds) }) } @@ -107,13 +102,13 @@ func (d *dbAppImpl) SaveDb(ctx context.Context, dbEntity *entity.Db, tagIds ...u // 关闭数据库连接 dbm.CloseDb(dbEntity.Id, v) // 删除该库关联的所有sql记录 - d.dbSqlRepo.DeleteByCond(ctx, &entity.DbSql{DbId: dbId, Db: v}) + d.DbSqlRepo.DeleteByCond(ctx, &entity.DbSql{DbId: dbId, Db: v}) } return d.Tx(ctx, func(ctx context.Context) error { return d.UpdateById(ctx, dbEntity) }, func(ctx context.Context) error { - return d.tagApp.RelateResource(ctx, old.Code, consts.TagResourceTypeDb, tagIds) + return d.TagApp.RelateResource(ctx, old.Code, consts.TagResourceTypeDb, tagIds) }) } @@ -134,10 +129,10 @@ func (d *dbAppImpl) Delete(ctx context.Context, id uint64) error { }, func(ctx context.Context) error { // 删除该库下用户保存的所有sql信息 - return d.dbSqlRepo.DeleteByCond(ctx, &entity.DbSql{DbId: id}) + return d.DbSqlRepo.DeleteByCond(ctx, &entity.DbSql{DbId: id}) }, func(ctx context.Context) error { var tagIds []uint64 - return d.tagApp.RelateResource(ctx, db.Code, consts.TagResourceTypeDb, tagIds) + return d.TagApp.RelateResource(ctx, db.Code, consts.TagResourceTypeDb, tagIds) }) } @@ -148,7 +143,7 @@ func (d *dbAppImpl) GetDbConn(dbId uint64, dbName string) (*dbi.DbConn, error) { return nil, errorx.NewBiz("数据库信息不存在") } - instance, err := d.dbInstanceApp.GetById(new(entity.DbInstance), db.InstanceId) + instance, err := d.DbInstanceApp.GetById(new(entity.DbInstance), db.InstanceId) if err != nil { return nil, errorx.NewBiz("数据库实例不存在") } @@ -169,7 +164,7 @@ func (d *dbAppImpl) GetDbConn(dbId uint64, dbName string) (*dbi.DbConn, error) { if err := instance.PwdDecrypt(); err != nil { return nil, errorx.NewBiz(err.Error()) } - return toDbInfo(instance, dbId, dbName, d.tagApp.ListTagPathByResource(consts.TagResourceTypeDb, db.Code)...), nil + return toDbInfo(instance, dbId, dbName, d.TagApp.ListTagPathByResource(consts.TagResourceTypeDb, db.Code)...), nil }) } diff --git a/server/internal/db/application/db_data_sync.go b/server/internal/db/application/db_data_sync.go index 13361d3d..2e51ba56 100644 --- a/server/internal/db/application/db_data_sync.go +++ b/server/internal/db/application/db_data_sync.go @@ -38,17 +38,14 @@ type DataSyncTask interface { GetTaskLogList(condition *entity.DataSyncLogQuery, pageParam *model.PageParam, toEntity any, orderBy ...string) (*model.PageResult[any], error) } -func newDataSyncApp(dataSyncRepo repository.DataSyncTask, dataSyncLogRepo repository.DataSyncLog) DataSyncTask { - app := new(dataSyncAppImpl) - app.Repo = dataSyncRepo - app.dataSyncLogRepo = dataSyncLogRepo - return app -} - type dataSyncAppImpl struct { base.AppImpl[*entity.DataSyncTask, repository.DataSyncTask] - dataSyncLogRepo repository.DataSyncLog + DbDataSyncLogRepo repository.DataSyncLog `inject:""` +} + +func (d *dataSyncAppImpl) InjectDbDataSyncTaskRepo(repo repository.DataSyncTask) { + d.Repo = repo } func (app *dataSyncAppImpl) GetPageList(condition *entity.DataSyncTaskQuery, pageParam *model.PageParam, toEntity any, orderBy ...string) (*model.PageResult[any], error) { @@ -328,7 +325,7 @@ func (app *dataSyncAppImpl) endRunning(taskEntity *entity.DataSyncTask, log *ent } func (app *dataSyncAppImpl) saveLog(log *entity.DataSyncLog) { - app.dataSyncLogRepo.Save(context.Background(), log) + app.DbDataSyncLogRepo.Save(context.Background(), log) } func (app *dataSyncAppImpl) InitCronJob() { @@ -374,5 +371,5 @@ func (app *dataSyncAppImpl) InitCronJob() { } func (app *dataSyncAppImpl) GetTaskLogList(condition *entity.DataSyncLogQuery, pageParam *model.PageParam, toEntity any, orderBy ...string) (*model.PageResult[any], error) { - return app.dataSyncLogRepo.GetTaskLogList(condition, pageParam, toEntity, orderBy...) + return app.DbDataSyncLogRepo.GetTaskLogList(condition, pageParam, toEntity, orderBy...) } diff --git a/server/internal/db/application/db_scheduler.go b/server/internal/db/application/db_scheduler.go index 8f3625e6..dc12b2a3 100644 --- a/server/internal/db/application/db_scheduler.go +++ b/server/internal/db/application/db_scheduler.go @@ -33,7 +33,7 @@ type dbScheduler struct { func newDbScheduler(repositories *repository.Repositories) (*dbScheduler, error) { scheduler := &dbScheduler{ - dbApp: dbApp, + dbApp: GetDbApp(), backupRepo: repositories.Backup, backupHistoryRepo: repositories.BackupHistory, restoreRepo: repositories.Restore, diff --git a/server/internal/db/application/db_sql.go b/server/internal/db/application/db_sql.go index 2d110258..6b2db4c9 100644 --- a/server/internal/db/application/db_sql.go +++ b/server/internal/db/application/db_sql.go @@ -14,8 +14,7 @@ type dbSqlAppImpl struct { base.AppImpl[*entity.DbSql, repository.DbSql] } -func newDbSqlApp(dbSqlRepo repository.DbSql) DbSql { - app := new(dbSqlAppImpl) - app.Repo = dbSqlRepo - return app +// 注入DbSqlRepo +func (d *dbSqlAppImpl) InjectDbSqlRepo(repo repository.DbSql) { + d.Repo = repo } diff --git a/server/internal/db/application/db_sql_exec.go b/server/internal/db/application/db_sql_exec.go index ddf1907d..28fd39fb 100644 --- a/server/internal/db/application/db_sql_exec.go +++ b/server/internal/db/application/db_sql_exec.go @@ -56,14 +56,8 @@ type DbSqlExec interface { GetPageList(condition *entity.DbSqlExecQuery, pageParam *model.PageParam, toEntity any, orderBy ...string) (*model.PageResult[any], error) } -func newDbSqlExecApp(dbExecSqlRepo repository.DbSqlExec) DbSqlExec { - return &dbSqlExecAppImpl{ - dbSqlExecRepo: dbExecSqlRepo, - } -} - type dbSqlExecAppImpl struct { - dbSqlExecRepo repository.DbSqlExec + DbSqlExecRepo repository.DbSqlExec `inject:""` } func createSqlExecRecord(ctx context.Context, execSqlReq *DbSqlExecReq) *entity.DbSqlExec { @@ -144,23 +138,23 @@ func (d *dbSqlExecAppImpl) Exec(ctx context.Context, execSqlReq *DbSqlExecReq) ( // 保存sql执行记录,如果是查询类则根据系统配置判断是否保存 func (d *dbSqlExecAppImpl) saveSqlExecLog(isQuery bool, dbSqlExecRecord *entity.DbSqlExec) { if !isQuery { - d.dbSqlExecRepo.Insert(context.TODO(), dbSqlExecRecord) + d.DbSqlExecRepo.Insert(context.TODO(), dbSqlExecRecord) return } if config.GetDbSaveQuerySql() { dbSqlExecRecord.Table = "-" dbSqlExecRecord.OldValue = "-" dbSqlExecRecord.Type = entity.DbSqlExecTypeQuery - d.dbSqlExecRepo.Insert(context.TODO(), dbSqlExecRecord) + d.DbSqlExecRepo.Insert(context.TODO(), dbSqlExecRecord) } } func (d *dbSqlExecAppImpl) DeleteBy(ctx context.Context, condition *entity.DbSqlExec) { - d.dbSqlExecRepo.DeleteByCond(ctx, condition) + d.DbSqlExecRepo.DeleteByCond(ctx, condition) } func (d *dbSqlExecAppImpl) GetPageList(condition *entity.DbSqlExecQuery, pageParam *model.PageParam, toEntity any, orderBy ...string) (*model.PageResult[any], error) { - return d.dbSqlExecRepo.GetPageList(condition, pageParam, toEntity, orderBy...) + return d.DbSqlExecRepo.GetPageList(condition, pageParam, toEntity, orderBy...) } func doSelect(ctx context.Context, selectStmt *sqlparser.Select, execSqlReq *DbSqlExecReq) (*DbSqlExecRes, error) { diff --git a/server/internal/db/application/instance.go b/server/internal/db/application/instance.go index bc5fa64f..46d4b473 100644 --- a/server/internal/db/application/instance.go +++ b/server/internal/db/application/instance.go @@ -30,16 +30,15 @@ type Instance interface { GetDatabases(entity *entity.DbInstance) ([]string, error) } -func newInstanceApp(instanceRepo repository.Instance) Instance { - app := new(instanceAppImpl) - app.Repo = instanceRepo - return app -} - type instanceAppImpl struct { base.AppImpl[*entity.DbInstance, repository.Instance] } +// 注入DbInstanceRepo +func (i *instanceAppImpl) InjectDbInstanceRepo(repo repository.Instance) { + i.Repo = repo +} + // GetPageList 分页获取数据库实例 func (app *instanceAppImpl) GetPageList(condition *entity.InstanceQuery, pageParam *model.PageParam, toEntity any, orderBy ...string) (*model.PageResult[any], error) { return app.GetRepo().GetInstanceList(condition, pageParam, toEntity, orderBy...) diff --git a/server/internal/db/infrastructure/persistence/persistence.go b/server/internal/db/infrastructure/persistence/persistence.go index 634d12bd..a5cab8d0 100644 --- a/server/internal/db/infrastructure/persistence/persistence.go +++ b/server/internal/db/infrastructure/persistence/persistence.go @@ -1,46 +1,49 @@ package persistence -import "mayfly-go/internal/db/domain/repository" - -var ( - instanceRepo repository.Instance = newInstanceRepo() - dbRepo repository.Db = newDbRepo() - dbSqlRepo repository.DbSql = newDbSqlRepo() - dbSqlExecRepo repository.DbSqlExec = newDbSqlExecRepo() - dbBackupHistoryRepo = NewDbBackupHistoryRepo() - dbRestoreHistoryRepo = NewDbRestoreHistoryRepo() - dbDataSyncTaskRepo repository.DataSyncTask = newDataSyncTaskRepo() - dbDataSyncLogRepo repository.DataSyncLog = newDataSyncLogRepo() +import ( + "mayfly-go/internal/db/domain/repository" + "mayfly-go/pkg/ioc" ) +func Init() { + ioc.Register(newInstanceRepo(), ioc.WithComponentName("DbInstanceRepo")) + ioc.Register(newDbRepo(), ioc.WithComponentName("DbRepo")) + ioc.Register(newDbSqlRepo(), ioc.WithComponentName("DbSqlRepo")) + ioc.Register(newDbSqlExecRepo(), ioc.WithComponentName("DbSqlExecRepo")) + ioc.Register(NewDbBackupHistoryRepo(), ioc.WithComponentName("DbBackupHistoryRepo")) + ioc.Register(NewDbRestoreHistoryRepo(), ioc.WithComponentName("DbRestoreHistoryRepo")) + ioc.Register(newDataSyncTaskRepo(), ioc.WithComponentName("DbDataSyncTaskRepo")) + ioc.Register(newDataSyncLogRepo(), ioc.WithComponentName("DbDataSyncLogRepo")) +} + func GetInstanceRepo() repository.Instance { - return instanceRepo + return ioc.Get[repository.Instance]("DbInstanceRepo") } func GetDbRepo() repository.Db { - return dbRepo + return ioc.Get[repository.Db]("DbRepo") } func GetDbSqlRepo() repository.DbSql { - return dbSqlRepo + return ioc.Get[repository.DbSql]("DbSqlRepo") } func GetDbSqlExecRepo() repository.DbSqlExec { - return dbSqlExecRepo + return ioc.Get[repository.DbSqlExec]("DbSqlExecRepo") } func GetDbBackupHistoryRepo() repository.DbBackupHistory { - return dbBackupHistoryRepo + return ioc.Get[repository.DbBackupHistory]("DbBackupHistoryRepo") } func GetDbRestoreHistoryRepo() repository.DbRestoreHistory { - return dbRestoreHistoryRepo + return ioc.Get[repository.DbRestoreHistory]("DbRestoreHistoryRepo") } func GetDataSyncLogRepo() repository.DataSyncLog { - return dbDataSyncLogRepo + return ioc.Get[repository.DataSyncLog]("DataSyncLogRepo") } func GetDataSyncTaskRepo() repository.DataSyncTask { - return dbDataSyncTaskRepo + return ioc.Get[repository.DataSyncTask]("DataSyncTaskRepo") } diff --git a/server/internal/db/router/db.go b/server/internal/db/router/db.go index dbfabee5..1f8da676 100644 --- a/server/internal/db/router/db.go +++ b/server/internal/db/router/db.go @@ -2,9 +2,8 @@ package router import ( "mayfly-go/internal/db/api" - "mayfly-go/internal/db/application" - msgapp "mayfly-go/internal/msg/application" - tagapp "mayfly-go/internal/tag/application" + "mayfly-go/pkg/biz" + "mayfly-go/pkg/ioc" "mayfly-go/pkg/req" "github.com/gin-gonic/gin" @@ -13,13 +12,8 @@ import ( func InitDbRouter(router *gin.RouterGroup) { db := router.Group("dbs") - d := &api.Db{ - InstanceApp: application.GetInstanceApp(), - DbApp: application.GetDbApp(), - DbSqlExecApp: application.GetDbSqlExecApp(), - MsgApp: msgapp.GetMsgApp(), - TagApp: tagapp.GetTagTreeApp(), - } + d := new(api.Db) + biz.ErrIsNil(ioc.Inject(d)) reqs := [...]*req.Conf{ // 获取数据库列表 diff --git a/server/internal/db/router/db_data_sync.go b/server/internal/db/router/db_data_sync.go index f2bd780f..a14cefc7 100644 --- a/server/internal/db/router/db_data_sync.go +++ b/server/internal/db/router/db_data_sync.go @@ -2,7 +2,8 @@ package router import ( "mayfly-go/internal/db/api" - "mayfly-go/internal/db/application" + "mayfly-go/pkg/biz" + "mayfly-go/pkg/ioc" "mayfly-go/pkg/req" "github.com/gin-gonic/gin" @@ -11,9 +12,8 @@ import ( func InitDbDataSyncRouter(router *gin.RouterGroup) { instances := router.Group("/datasync/tasks") - d := &api.DataSyncTask{ - DataSyncTaskApp: application.GetDataSyncTaskApp(), - } + d := new(api.DataSyncTask) + biz.ErrIsNil(ioc.Inject(d)) reqs := [...]*req.Conf{ // 获取任务列表 /datasync diff --git a/server/internal/db/router/db_sql.go b/server/internal/db/router/db_sql.go index 9f7f7150..d74bb3d4 100644 --- a/server/internal/db/router/db_sql.go +++ b/server/internal/db/router/db_sql.go @@ -2,7 +2,8 @@ package router import ( "mayfly-go/internal/db/api" - "mayfly-go/internal/db/application" + "mayfly-go/pkg/biz" + "mayfly-go/pkg/ioc" "mayfly-go/pkg/req" "github.com/gin-gonic/gin" @@ -11,9 +12,8 @@ import ( func InitDbSqlRouter(router *gin.RouterGroup) { db := router.Group("dbs") - dbSql := &api.DbSql{ - DbSqlApp: application.GetDbSqlApp(), - } + dbSql := new(api.DbSql) + biz.ErrIsNil(ioc.Inject(dbSql)) reqs := [...]*req.Conf{ diff --git a/server/internal/db/router/db_sql_exec.go b/server/internal/db/router/db_sql_exec.go index d610fef9..1420738e 100644 --- a/server/internal/db/router/db_sql_exec.go +++ b/server/internal/db/router/db_sql_exec.go @@ -2,7 +2,8 @@ package router import ( "mayfly-go/internal/db/api" - "mayfly-go/internal/db/application" + "mayfly-go/pkg/biz" + "mayfly-go/pkg/ioc" "mayfly-go/pkg/req" "github.com/gin-gonic/gin" @@ -11,9 +12,8 @@ import ( func InitDbSqlExecRouter(router *gin.RouterGroup) { db := router.Group("/dbs/:dbId/sql-execs") - d := &api.DbSqlExec{ - DbSqlExecApp: application.GetDbSqlExecApp(), - } + d := new(api.DbSqlExec) + biz.ErrIsNil(ioc.Inject(d)) // 获取所有数据库sql执行记录列表 req.NewGet("", d.DbSqlExecs).Group(db) diff --git a/server/internal/db/router/instance.go b/server/internal/db/router/instance.go index 75e419cb..81cbdeae 100644 --- a/server/internal/db/router/instance.go +++ b/server/internal/db/router/instance.go @@ -2,7 +2,8 @@ package router import ( "mayfly-go/internal/db/api" - "mayfly-go/internal/db/application" + "mayfly-go/pkg/biz" + "mayfly-go/pkg/ioc" "mayfly-go/pkg/req" "github.com/gin-gonic/gin" @@ -11,10 +12,8 @@ import ( func InitInstanceRouter(router *gin.RouterGroup) { instances := router.Group("/instances") - d := &api.Instance{ - InstanceApp: application.GetInstanceApp(), - DbApp: application.GetDbApp(), - } + d := new(api.Instance) + biz.ErrIsNil(ioc.Inject(d)) reqs := [...]*req.Conf{ // 获取数据库列表 diff --git a/server/internal/machine/api/auth_cert.go b/server/internal/machine/api/auth_cert.go index d6a2b3ab..6ebaaabf 100644 --- a/server/internal/machine/api/auth_cert.go +++ b/server/internal/machine/api/auth_cert.go @@ -13,7 +13,7 @@ import ( ) type AuthCert struct { - AuthCertApp application.AuthCert + AuthCertApp application.AuthCert `inject:""` } func (ac *AuthCert) BaseAuthCerts(rc *req.Ctx) { diff --git a/server/internal/machine/api/machine.go b/server/internal/machine/api/machine.go index 74cc1860..6ff4ec24 100644 --- a/server/internal/machine/api/machine.go +++ b/server/internal/machine/api/machine.go @@ -29,9 +29,9 @@ import ( ) type Machine struct { - MachineApp application.Machine - MachineTermOpApp application.MachineTermOp - TagApp tagapp.TagTree + MachineApp application.Machine `inject:""` + MachineTermOpApp application.MachineTermOp `inject:""` + TagApp tagapp.TagTree `inject:"TagTreeApp"` } func (m *Machine) Machines(rc *req.Ctx) { diff --git a/server/internal/machine/api/machine_cronjob.go b/server/internal/machine/api/machine_cronjob.go index a77cefbc..1ddb49a2 100644 --- a/server/internal/machine/api/machine_cronjob.go +++ b/server/internal/machine/api/machine_cronjob.go @@ -15,7 +15,7 @@ import ( ) type MachineCronJob struct { - MachineCronJobApp application.MachineCronJob + MachineCronJobApp application.MachineCronJob `inject:""` } func (m *MachineCronJob) MachineCronJobs(rc *req.Ctx) { diff --git a/server/internal/machine/api/machine_file.go b/server/internal/machine/api/machine_file.go index 02f5ee11..9d15fbd4 100644 --- a/server/internal/machine/api/machine_file.go +++ b/server/internal/machine/api/machine_file.go @@ -31,8 +31,8 @@ import ( ) type MachineFile struct { - MachineFileApp application.MachineFile - MsgApp msgapp.Msg + MachineFileApp application.MachineFile `inject:""` + MsgApp msgapp.Msg `inject:""` } const ( diff --git a/server/internal/machine/api/machine_script.go b/server/internal/machine/api/machine_script.go index 3733ec08..5a038483 100644 --- a/server/internal/machine/api/machine_script.go +++ b/server/internal/machine/api/machine_script.go @@ -19,9 +19,9 @@ import ( ) type MachineScript struct { - MachineScriptApp application.MachineScript - MachineApp application.Machine - TagApp tagapp.TagTree + MachineScriptApp application.MachineScript `inject:""` + MachineApp application.Machine `inject:""` + TagApp tagapp.TagTree `inject:"TagTreeApp"` } func (m *MachineScript) MachineScripts(rc *req.Ctx) { diff --git a/server/internal/machine/application/application.go b/server/internal/machine/application/application.go index c66efcf1..31147c4a 100644 --- a/server/internal/machine/application/application.go +++ b/server/internal/machine/application/application.go @@ -2,58 +2,40 @@ package application import ( "mayfly-go/internal/machine/infrastructure/persistence" - tagapp "mayfly-go/internal/tag/application" + "mayfly-go/pkg/ioc" ) -var ( - machineApp Machine = newMachineApp( - persistence.GetMachineRepo(), - GetAuthCertApp(), - tagapp.GetTagTreeApp(), - ) +func init() { + persistence.Init() - machineFileApp MachineFile = newMachineFileApp( - persistence.GetMachineFileRepo(), - GetMachineApp(), - ) - - machineScriptApp MachineScript = newMachineScriptApp( - persistence.GetMachineScriptRepo(), - GetMachineApp(), - ) - - authCertApp AuthCert = newAuthCertApp(persistence.GetAuthCertRepo()) - - machineCropJobApp MachineCronJob = newMachineCronJobApp( - persistence.GetMachineCronJobRepo(), - persistence.GetMachineCronJobRelateRepo(), - persistence.GetMachineCronJobExecRepo(), - GetMachineApp(), - ) - - machineTermOpApp MachineTermOp = newMachineTermOpApp(persistence.GetMachineTermOpRepo()) -) + ioc.Register(new(machineAppImpl), ioc.WithComponentName("MachineApp")) + ioc.Register(new(machineFileAppImpl), ioc.WithComponentName("MachineFileApp")) + ioc.Register(new(machineScriptAppImpl), ioc.WithComponentName("MachineScriptApp")) + ioc.Register(new(authCertAppImpl), ioc.WithComponentName("AuthCertApp")) + ioc.Register(new(machineCronJobAppImpl), ioc.WithComponentName("MachineCronJobApp")) + ioc.Register(new(machineTermOpAppImpl), ioc.WithComponentName("MachineTermOpApp")) +} func GetMachineApp() Machine { - return machineApp + return ioc.Get[Machine]("MachineApp") } func GetMachineFileApp() MachineFile { - return machineFileApp + return ioc.Get[MachineFile]("MachineFileApp") } func GetMachineScriptApp() MachineScript { - return machineScriptApp + return ioc.Get[MachineScript]("MachineScriptApp") } func GetAuthCertApp() AuthCert { - return authCertApp + return ioc.Get[AuthCert]("AuthCertApp") } func GetMachineCronJobApp() MachineCronJob { - return machineCropJobApp + return ioc.Get[MachineCronJob]("MachineCronJobApp") } func GetMachineTermOpApp() MachineTermOp { - return machineTermOpApp + return ioc.Get[MachineTermOp]("MachineTermOpApp") } diff --git a/server/internal/machine/application/auth_cert.go b/server/internal/machine/application/auth_cert.go index d95647ef..5aa0c3eb 100644 --- a/server/internal/machine/application/auth_cert.go +++ b/server/internal/machine/application/auth_cert.go @@ -19,16 +19,15 @@ type AuthCert interface { GetByIds(ids ...uint64) []*entity.AuthCert } -func newAuthCertApp(authCertRepo repository.AuthCert) AuthCert { - return &authCertAppImpl{ - base.AppImpl[*entity.AuthCert, repository.AuthCert]{Repo: authCertRepo}, - } -} - type authCertAppImpl struct { base.AppImpl[*entity.AuthCert, repository.AuthCert] } +// 注入AuthCertRepo +func (a *authCertAppImpl) InjectAuthCertRepo(repo repository.AuthCert) { + a.Repo = repo +} + func (a *authCertAppImpl) GetPageList(condition *entity.AuthCertQuery, pageParam *model.PageParam, toEntity any, orderBy ...string) (*model.PageResult[any], error) { return a.GetRepo().GetPageList(condition, pageParam, toEntity) } diff --git a/server/internal/machine/application/machine.go b/server/internal/machine/application/machine.go index 739d20f2..c2d57238 100644 --- a/server/internal/machine/application/machine.go +++ b/server/internal/machine/application/machine.go @@ -49,24 +49,16 @@ type Machine interface { GetMachineStats(machineId uint64) (*mcm.Stats, error) } -func newMachineApp(machineRepo repository.Machine, - authCertApp AuthCert, - tagApp tagapp.TagTree) Machine { - app := &machineAppImpl{ - authCertApp: authCertApp, - tagApp: tagApp, - } - - app.Repo = machineRepo - return app -} - type machineAppImpl struct { base.AppImpl[*entity.Machine, repository.Machine] - authCertApp AuthCert + AuthCertApp AuthCert `inject:""` + TagApp tagapp.TagTree `inject:"TagTreeApp"` +} - tagApp tagapp.TagTree +// 注入MachineRepo +func (m *machineAppImpl) InjectMachineRepo(repo repository.Machine) { + m.Repo = repo } // 分页获取机器信息列表 @@ -99,7 +91,7 @@ func (m *machineAppImpl) SaveMachine(ctx context.Context, me *entity.Machine, ta return m.Tx(ctx, func(ctx context.Context) error { return m.Insert(ctx, me) }, func(ctx context.Context) error { - return m.tagApp.RelateResource(ctx, resouceCode, consts.TagResourceTypeMachine, tagIds) + return m.TagApp.RelateResource(ctx, resouceCode, consts.TagResourceTypeMachine, tagIds) }) } @@ -117,7 +109,7 @@ func (m *machineAppImpl) SaveMachine(ctx context.Context, me *entity.Machine, ta return m.Tx(ctx, func(ctx context.Context) error { return m.UpdateById(ctx, me) }, func(ctx context.Context) error { - return m.tagApp.RelateResource(ctx, oldMachine.Code, consts.TagResourceTypeMachine, tagIds) + return m.TagApp.RelateResource(ctx, oldMachine.Code, consts.TagResourceTypeMachine, tagIds) }) } @@ -162,7 +154,7 @@ func (m *machineAppImpl) Delete(ctx context.Context, id uint64) error { return m.DeleteById(ctx, id) }, func(ctx context.Context) error { var tagIds []uint64 - return m.tagApp.RelateResource(ctx, machine.Code, consts.TagResourceTypeMachine, tagIds) + return m.TagApp.RelateResource(ctx, machine.Code, consts.TagResourceTypeMachine, tagIds) }) } @@ -235,11 +227,11 @@ func (m *machineAppImpl) toMachineInfo(me *entity.Machine) (*mcm.MachineInfo, er mi.Ip = me.Ip mi.Port = me.Port mi.Username = me.Username - mi.TagPath = m.tagApp.ListTagPathByResource(consts.TagResourceTypeMachine, me.Code) + mi.TagPath = m.TagApp.ListTagPathByResource(consts.TagResourceTypeMachine, me.Code) mi.EnableRecorder = me.EnableRecorder if me.UseAuthCert() { - ac, err := m.authCertApp.GetById(new(entity.AuthCert), uint64(me.AuthCertId)) + ac, err := m.AuthCertApp.GetById(new(entity.AuthCert), uint64(me.AuthCertId)) if err != nil { return nil, errorx.NewBiz("授权凭证信息已不存在,请重新关联") } diff --git a/server/internal/machine/application/machine_cronjob.go b/server/internal/machine/application/machine_cronjob.go index a42c5472..1a2463da 100644 --- a/server/internal/machine/application/machine_cronjob.go +++ b/server/internal/machine/application/machine_cronjob.go @@ -50,41 +50,31 @@ type MachineCronJob interface { RunCronJob(key string) } -type machineCropJobAppImpl struct { +type machineCronJobAppImpl struct { base.AppImpl[*entity.MachineCronJob, repository.MachineCronJob] - machineCropJobRelateRepo repository.MachineCronJobRelate - machineCropJobExecRepo repository.MachineCronJobExec - machineApp Machine + MachineCronJobRelateRepo repository.MachineCronJobRelate `inject:""` + MachineCronJobExecRepo repository.MachineCronJobExec `inject:""` + MachineApp Machine `inject:""` } -func newMachineCronJobApp( - machineCropJobRepo repository.MachineCronJob, - machineCropJobRelateRepo repository.MachineCronJobRelate, - machineCropJobExecRepo repository.MachineCronJobExec, - machineApp Machine, -) MachineCronJob { - app := &machineCropJobAppImpl{ - machineCropJobRelateRepo: machineCropJobRelateRepo, - machineCropJobExecRepo: machineCropJobExecRepo, - machineApp: machineApp, - } - app.Repo = machineCropJobRepo - return app +// 注入MachineCronJobRepo +func (m *machineCronJobAppImpl) InjectMachineCronJobRepo(repo repository.MachineCronJob) { + m.Repo = repo } // 分页获取机器脚本任务列表 -func (m *machineCropJobAppImpl) GetPageList(condition *entity.MachineCronJob, pageParam *model.PageParam, toEntity any, orderBy ...string) (*model.PageResult[any], error) { +func (m *machineCronJobAppImpl) GetPageList(condition *entity.MachineCronJob, pageParam *model.PageParam, toEntity any, orderBy ...string) (*model.PageResult[any], error) { return m.GetRepo().GetPageList(condition, pageParam, toEntity, orderBy...) } // 获取分页执行结果列表 -func (m *machineCropJobAppImpl) GetExecPageList(condition *entity.MachineCronJobExec, pageParam *model.PageParam, toEntity any, orderBy ...string) (*model.PageResult[any], error) { - return m.machineCropJobExecRepo.GetPageList(condition, pageParam, toEntity, orderBy...) +func (m *machineCronJobAppImpl) GetExecPageList(condition *entity.MachineCronJobExec, pageParam *model.PageParam, toEntity any, orderBy ...string) (*model.PageResult[any], error) { + return m.MachineCronJobExecRepo.GetPageList(condition, pageParam, toEntity, orderBy...) } // 保存机器任务信息 -func (m *machineCropJobAppImpl) SaveMachineCronJob(ctx context.Context, mcj *entity.MachineCronJob) (uint64, error) { +func (m *machineCronJobAppImpl) SaveMachineCronJob(ctx context.Context, mcj *entity.MachineCronJob) (uint64, error) { // 更新操作 if mcj.Id != 0 { m.UpdateById(ctx, mcj) @@ -104,22 +94,22 @@ func (m *machineCropJobAppImpl) SaveMachineCronJob(ctx context.Context, mcj *ent return mcj.Id, nil } -func (m *machineCropJobAppImpl) Delete(ctx context.Context, id uint64) { +func (m *machineCronJobAppImpl) Delete(ctx context.Context, id uint64) { m.DeleteById(ctx, id) - m.machineCropJobExecRepo.DeleteByCond(ctx, &entity.MachineCronJobExec{CronJobId: id}) - m.machineCropJobRelateRepo.DeleteByCond(ctx, &entity.MachineCronJobRelate{CronJobId: id}) + m.MachineCronJobExecRepo.DeleteByCond(ctx, &entity.MachineCronJobExec{CronJobId: id}) + m.MachineCronJobRelateRepo.DeleteByCond(ctx, &entity.MachineCronJobRelate{CronJobId: id}) } -func (m *machineCropJobAppImpl) GetRelateMachineIds(cronJobId uint64) []uint64 { - return m.machineCropJobRelateRepo.GetMachineIds(cronJobId) +func (m *machineCronJobAppImpl) GetRelateMachineIds(cronJobId uint64) []uint64 { + return m.MachineCronJobRelateRepo.GetMachineIds(cronJobId) } -func (m *machineCropJobAppImpl) GetRelateCronJobIds(machineId uint64) []uint64 { - return m.machineCropJobRelateRepo.GetCronJobIds(machineId) +func (m *machineCronJobAppImpl) GetRelateCronJobIds(machineId uint64) []uint64 { + return m.MachineCronJobRelateRepo.GetCronJobIds(machineId) } -func (m *machineCropJobAppImpl) CronJobRelateMachines(ctx context.Context, cronJobId uint64, machineIds []uint64) { - oldMachineIds := m.machineCropJobRelateRepo.GetMachineIds(cronJobId) +func (m *machineCronJobAppImpl) CronJobRelateMachines(ctx context.Context, cronJobId uint64, machineIds []uint64) { + oldMachineIds := m.MachineCronJobRelateRepo.GetMachineIds(cronJobId) addIds, delIds, _ := collx.ArrayCompare[uint64](machineIds, oldMachineIds) addVals := make([]*entity.MachineCronJobRelate, 0) @@ -129,20 +119,20 @@ func (m *machineCropJobAppImpl) CronJobRelateMachines(ctx context.Context, cronJ CronJobId: cronJobId, }) } - m.machineCropJobRelateRepo.BatchInsert(ctx, addVals) + m.MachineCronJobRelateRepo.BatchInsert(ctx, addVals) for _, delId := range delIds { - m.machineCropJobRelateRepo.DeleteByCond(ctx, &entity.MachineCronJobRelate{CronJobId: cronJobId, MachineId: delId}) + m.MachineCronJobRelateRepo.DeleteByCond(ctx, &entity.MachineCronJobRelate{CronJobId: cronJobId, MachineId: delId}) } } -func (m *machineCropJobAppImpl) MachineRelateCronJobs(ctx context.Context, machineId uint64, cronJobs []uint64) { +func (m *machineCronJobAppImpl) MachineRelateCronJobs(ctx context.Context, machineId uint64, cronJobs []uint64) { if len(cronJobs) == 0 { - m.machineCropJobRelateRepo.DeleteByCond(ctx, &entity.MachineCronJobRelate{MachineId: machineId}) + m.MachineCronJobRelateRepo.DeleteByCond(ctx, &entity.MachineCronJobRelate{MachineId: machineId}) return } - oldCronIds := m.machineCropJobRelateRepo.GetCronJobIds(machineId) + oldCronIds := m.MachineCronJobRelateRepo.GetCronJobIds(machineId) addIds, delIds, _ := collx.ArrayCompare[uint64](cronJobs, oldCronIds) addVals := make([]*entity.MachineCronJobRelate, 0) @@ -152,14 +142,14 @@ func (m *machineCropJobAppImpl) MachineRelateCronJobs(ctx context.Context, machi CronJobId: addId, }) } - m.machineCropJobRelateRepo.BatchInsert(ctx, addVals) + m.MachineCronJobRelateRepo.BatchInsert(ctx, addVals) for _, delId := range delIds { - m.machineCropJobRelateRepo.DeleteByCond(ctx, &entity.MachineCronJobRelate{CronJobId: delId, MachineId: machineId}) + m.MachineCronJobRelateRepo.DeleteByCond(ctx, &entity.MachineCronJobRelate{CronJobId: delId, MachineId: machineId}) } } -func (m *machineCropJobAppImpl) InitCronJob() { +func (m *machineCronJobAppImpl) InitCronJob() { defer func() { if err := recover(); err != nil { logx.ErrorTrace("机器计划任务初始化失败: %s", err.(error)) @@ -192,7 +182,7 @@ func (m *machineCropJobAppImpl) InitCronJob() { } } -func (m *machineCropJobAppImpl) RunCronJob(key string) { +func (m *machineCronJobAppImpl) RunCronJob(key string) { // 简单使用redis分布式锁防止多实例同一时刻重复执行 if lock := rediscli.NewLock(key, 30*time.Second); lock != nil { if !lock.Lock() { @@ -209,13 +199,13 @@ func (m *machineCropJobAppImpl) RunCronJob(key string) { scheduler.RemoveByKey(key) } - machienIds := m.machineCropJobRelateRepo.GetMachineIds(cronJob.Id) + machienIds := m.MachineCronJobRelateRepo.GetMachineIds(cronJob.Id) for _, machineId := range machienIds { go m.runCronJob0(machineId, cronJob) } } -func (m *machineCropJobAppImpl) addCronJob(mcj *entity.MachineCronJob) { +func (m *machineCronJobAppImpl) addCronJob(mcj *entity.MachineCronJob) { var key string isDisable := mcj.Status == entity.MachineCronJobStatusDisable if mcj.Id == 0 { @@ -237,11 +227,11 @@ func (m *machineCropJobAppImpl) addCronJob(mcj *entity.MachineCronJob) { go m.RunCronJob(key) }) } -func (m *machineCropJobAppImpl) runCronJob0(mid uint64, cronJob *entity.MachineCronJob) { +func (m *machineCronJobAppImpl) runCronJob0(mid uint64, cronJob *entity.MachineCronJob) { defer func() { if err := recover(); err != nil { res := anyx.ToString(err) - m.machineCropJobExecRepo.Insert(context.TODO(), &entity.MachineCronJobExec{ + m.MachineCronJobExecRepo.Insert(context.TODO(), &entity.MachineCronJobExec{ MachineId: mid, CronJobId: cronJob.Id, ExecTime: time.Now(), @@ -252,7 +242,7 @@ func (m *machineCropJobAppImpl) runCronJob0(mid uint64, cronJob *entity.MachineC } }() - machineCli, err := m.machineApp.GetCli(uint64(mid)) + machineCli, err := m.MachineApp.GetCli(uint64(mid)) biz.ErrIsNilAppendErr(err, "获取客户端连接失败: %s") res, err := machineCli.Run(cronJob.Script) if err != nil { @@ -281,5 +271,5 @@ func (m *machineCropJobAppImpl) runCronJob0(mid uint64, cronJob *entity.MachineC execRes.Status = entity.MachineCronJobExecStatusError } // 保存执行记录 - m.machineCropJobExecRepo.Insert(context.TODO(), execRes) + m.MachineCronJobExecRepo.Insert(context.TODO(), execRes) } diff --git a/server/internal/machine/application/machine_file.go b/server/internal/machine/application/machine_file.go index 42f908e5..0d28acec 100644 --- a/server/internal/machine/application/machine_file.go +++ b/server/internal/machine/application/machine_file.go @@ -72,42 +72,40 @@ type MachineFile interface { Rename(fileId uint64, oldname string, newname string) (*mcm.MachineInfo, error) } -func newMachineFileApp(machineFileRepo repository.MachineFile, machineApp Machine) MachineFile { - app := &machineFileAppImpl{machineApp: machineApp, machineFileRepo: machineFileRepo} - app.Repo = machineFileRepo - return app -} - type machineFileAppImpl struct { base.AppImpl[*entity.MachineFile, repository.MachineFile] - machineFileRepo repository.MachineFile + MachineFileRepo repository.MachineFile `inject:""` + MachineApp Machine `inject:""` +} - machineApp Machine +// 注入MachineFileRepo +func (m *machineFileAppImpl) InjectMachineFileRepo(repo repository.MachineFile) { + m.Repo = repo } // 分页获取机器脚本信息列表 func (m *machineFileAppImpl) GetPageList(condition *entity.MachineFile, pageParam *model.PageParam, toEntity any, orderBy ...string) (*model.PageResult[any], error) { - return m.machineFileRepo.GetPageList(condition, pageParam, toEntity, orderBy...) + return m.MachineFileRepo.GetPageList(condition, pageParam, toEntity, orderBy...) } // 根据条件获取 func (m *machineFileAppImpl) GetMachineFile(condition *entity.MachineFile, cols ...string) error { - return m.machineFileRepo.GetBy(condition, cols...) + return m.MachineFileRepo.GetBy(condition, cols...) } // 保存机器文件配置 func (m *machineFileAppImpl) Save(ctx context.Context, mf *entity.MachineFile) error { - _, err := m.machineApp.GetById(new(entity.Machine), mf.MachineId, "Name") + _, err := m.MachineApp.GetById(new(entity.Machine), mf.MachineId, "Name") if err != nil { return errorx.NewBiz("该机器不存在") } if mf.Id != 0 { - return m.machineFileRepo.UpdateById(ctx, mf) + return m.MachineFileRepo.UpdateById(ctx, mf) } - return m.machineFileRepo.Insert(ctx, mf) + return m.MachineFileRepo.Insert(ctx, mf) } func (m *machineFileAppImpl) ReadDir(fid uint64, path string) ([]fs.FileInfo, error) { @@ -308,7 +306,7 @@ func (m *machineFileAppImpl) GetMachineCli(fid uint64, inputPath ...string) (*mc return nil, errorx.NewBiz("无权访问该目录或文件: %s", path) } } - return m.machineApp.GetCli(mf.MachineId) + return m.MachineApp.GetCli(mf.MachineId) } // 获取文件机器 sftp cli diff --git a/server/internal/machine/application/machine_script.go b/server/internal/machine/application/machine_script.go index 16faef67..51b1ced4 100644 --- a/server/internal/machine/application/machine_script.go +++ b/server/internal/machine/application/machine_script.go @@ -20,16 +20,15 @@ type MachineScript interface { Delete(ctx context.Context, id uint64) } -func newMachineScriptApp(machineScriptRepo repository.MachineScript, machineApp Machine) MachineScript { - app := &machineScriptAppImpl{machineApp: machineApp} - app.Repo = machineScriptRepo - return app -} - type machineScriptAppImpl struct { base.AppImpl[*entity.MachineScript, repository.MachineScript] - machineApp Machine + MachineApp Machine `inject:""` +} + +// 注入MachineScriptRepo +func (m *machineScriptAppImpl) InjectMachineScriptRepo(repo repository.MachineScript) { + m.Repo = repo } const Common_Script_Machine_Id = 9999999 @@ -43,7 +42,7 @@ func (m *machineScriptAppImpl) GetPageList(condition *entity.MachineScript, page func (m *machineScriptAppImpl) Save(ctx context.Context, ms *entity.MachineScript) error { // 如果机器id不为公共脚本id,则校验机器是否存在 if machineId := ms.MachineId; machineId != Common_Script_Machine_Id { - _, err := m.machineApp.GetById(new(entity.Machine), machineId, "Name") + _, err := m.MachineApp.GetById(new(entity.Machine), machineId, "Name") if err != nil { return errorx.NewBiz("该机器不存在") } diff --git a/server/internal/machine/application/machine_term_op.go b/server/internal/machine/application/machine_term_op.go index a8497cf0..7e947d47 100644 --- a/server/internal/machine/application/machine_term_op.go +++ b/server/internal/machine/application/machine_term_op.go @@ -33,16 +33,15 @@ type MachineTermOp interface { TimerDeleteTermOp() } -func newMachineTermOpApp(machineTermOpRepo repository.MachineTermOp) MachineTermOp { - return &machineTermOpAppImpl{ - base.AppImpl[*entity.MachineTermOp, repository.MachineTermOp]{Repo: machineTermOpRepo}, - } -} - type machineTermOpAppImpl struct { base.AppImpl[*entity.MachineTermOp, repository.MachineTermOp] } +// 注入MachineTermOpRepo +func (m *machineTermOpAppImpl) InjectMachineTermOpRepo(repo repository.MachineTermOp) { + m.Repo = repo +} + func (m *machineTermOpAppImpl) TermConn(ctx context.Context, cli *mcm.Cli, wsConn *websocket.Conn, rows, cols int) error { var recorder *mcm.Recorder var termOpRecord *entity.MachineTermOp diff --git a/server/internal/machine/infrastructure/persistence/machine_cronjob.go b/server/internal/machine/infrastructure/persistence/machine_cronjob.go index a5b3a0e1..2e958662 100644 --- a/server/internal/machine/infrastructure/persistence/machine_cronjob.go +++ b/server/internal/machine/infrastructure/persistence/machine_cronjob.go @@ -8,16 +8,16 @@ import ( "mayfly-go/pkg/model" ) -type machineCropJobRepoImpl struct { +type machineCronJobRepoImpl struct { base.RepoImpl[*entity.MachineCronJob] } func newMachineCronJobRepo() repository.MachineCronJob { - return &machineCropJobRepoImpl{base.RepoImpl[*entity.MachineCronJob]{M: new(entity.MachineCronJob)}} + return &machineCronJobRepoImpl{base.RepoImpl[*entity.MachineCronJob]{M: new(entity.MachineCronJob)}} } // 分页获取机器信息列表 -func (m *machineCropJobRepoImpl) GetPageList(condition *entity.MachineCronJob, pageParam *model.PageParam, toEntity any, orderBy ...string) (*model.PageResult[any], error) { +func (m *machineCronJobRepoImpl) GetPageList(condition *entity.MachineCronJob, pageParam *model.PageParam, toEntity any, orderBy ...string) (*model.PageResult[any], error) { qd := gormx.NewQuery(condition).Like("name", condition.Name).Eq("status", condition.Status).WithOrderBy(orderBy...) return gormx.PageQuery(qd, pageParam, toEntity) } diff --git a/server/internal/machine/infrastructure/persistence/machine_cronjob_relate.go b/server/internal/machine/infrastructure/persistence/machine_cronjob_relate.go index 21316e99..3abb9103 100644 --- a/server/internal/machine/infrastructure/persistence/machine_cronjob_relate.go +++ b/server/internal/machine/infrastructure/persistence/machine_cronjob_relate.go @@ -7,27 +7,27 @@ import ( "mayfly-go/pkg/gormx" ) -type machineCropJobRelateRepoImpl struct { +type machineCronJobRelateRepoImpl struct { base.RepoImpl[*entity.MachineCronJobRelate] } -func newMachineCropJobRelateRepo() repository.MachineCronJobRelate { - return &machineCropJobRelateRepoImpl{base.RepoImpl[*entity.MachineCronJobRelate]{M: new(entity.MachineCronJobRelate)}} +func newMachineCronJobRelateRepo() repository.MachineCronJobRelate { + return &machineCronJobRelateRepoImpl{base.RepoImpl[*entity.MachineCronJobRelate]{M: new(entity.MachineCronJobRelate)}} } -func (m *machineCropJobRelateRepoImpl) GetList(condition *entity.MachineCronJobRelate) []entity.MachineCronJobRelate { +func (m *machineCronJobRelateRepoImpl) GetList(condition *entity.MachineCronJobRelate) []entity.MachineCronJobRelate { list := new([]entity.MachineCronJobRelate) m.ListByCond(condition, list) return *list } -func (m *machineCropJobRelateRepoImpl) GetMachineIds(cronJobId uint64) []uint64 { +func (m *machineCronJobRelateRepoImpl) GetMachineIds(cronJobId uint64) []uint64 { var machineIds []uint64 m.ListByCond(&entity.MachineCronJobRelate{CronJobId: cronJobId}, &machineIds, "machine_id") return machineIds } -func (m *machineCropJobRelateRepoImpl) GetCronJobIds(machineId uint64) []uint64 { +func (m *machineCronJobRelateRepoImpl) GetCronJobIds(machineId uint64) []uint64 { var cronJobIds []uint64 gormx.ListBy(&entity.MachineCronJobRelate{MachineId: machineId}, &cronJobIds, "cron_job_id") return cronJobIds diff --git a/server/internal/machine/infrastructure/persistence/persistence.go b/server/internal/machine/infrastructure/persistence/persistence.go index 6509fdaa..5b0c0cc3 100644 --- a/server/internal/machine/infrastructure/persistence/persistence.go +++ b/server/internal/machine/infrastructure/persistence/persistence.go @@ -1,46 +1,49 @@ package persistence -import "mayfly-go/internal/machine/domain/repository" - -var ( - machineRepo repository.Machine = newMachineRepo() - machineFileRepo repository.MachineFile = newMachineFileRepo() - machineScriptRepo repository.MachineScript = newMachineScriptRepo() - authCertRepo repository.AuthCert = newAuthCertRepo() - machineCropJobRepo repository.MachineCronJob = newMachineCronJobRepo() - machineCropJobExecRepo repository.MachineCronJobExec = newMachineCronJobExecRepo() - machineCronJobRelateRepo repository.MachineCronJobRelate = newMachineCropJobRelateRepo() - machineTermOpRepo repository.MachineTermOp = newMachineTermOpRepoImpl() +import ( + "mayfly-go/internal/machine/domain/repository" + "mayfly-go/pkg/ioc" ) +func Init() { + ioc.Register(newMachineRepo(), ioc.WithComponentName("MachineRepo")) + ioc.Register(newMachineFileRepo(), ioc.WithComponentName("MachineFileRepo")) + ioc.Register(newMachineScriptRepo(), ioc.WithComponentName("MachineScriptRepo")) + ioc.Register(newAuthCertRepo(), ioc.WithComponentName("AuthCertRepo")) + ioc.Register(newMachineCronJobRepo(), ioc.WithComponentName("MachineCronJobRepo")) + ioc.Register(newMachineCronJobExecRepo(), ioc.WithComponentName("MachineCronJobExecRepo")) + ioc.Register(newMachineCronJobRelateRepo(), ioc.WithComponentName("MachineCronJobRelateRepo")) + ioc.Register(newMachineTermOpRepoImpl(), ioc.WithComponentName("MachineTermOpRepo")) +} + func GetMachineRepo() repository.Machine { - return machineRepo + return ioc.Get[repository.Machine]("MachineRepo") } func GetMachineFileRepo() repository.MachineFile { - return machineFileRepo + return ioc.Get[repository.MachineFile]("MachineFileRepo") } func GetMachineScriptRepo() repository.MachineScript { - return machineScriptRepo + return ioc.Get[repository.MachineScript]("MachineScriptRepo") } func GetAuthCertRepo() repository.AuthCert { - return authCertRepo + return ioc.Get[repository.AuthCert]("AuthCertRepo") } func GetMachineCronJobRepo() repository.MachineCronJob { - return machineCropJobRepo + return ioc.Get[repository.MachineCronJob]("MachineCronJobRepo") } func GetMachineCronJobExecRepo() repository.MachineCronJobExec { - return machineCropJobExecRepo + return ioc.Get[repository.MachineCronJobExec]("MachineCronJobExecRepo") } func GetMachineCronJobRelateRepo() repository.MachineCronJobRelate { - return machineCronJobRelateRepo + return ioc.Get[repository.MachineCronJobRelate]("MachineCropJobRelateRepo") } func GetMachineTermOpRepo() repository.MachineTermOp { - return machineTermOpRepo + return ioc.Get[repository.MachineTermOp]("MachineTermOpRepo") } diff --git a/server/internal/machine/router/auth_cert.go b/server/internal/machine/router/auth_cert.go index 2973a091..d63ebf04 100644 --- a/server/internal/machine/router/auth_cert.go +++ b/server/internal/machine/router/auth_cert.go @@ -2,17 +2,19 @@ package router import ( "mayfly-go/internal/machine/api" - "mayfly-go/internal/machine/application" + "mayfly-go/pkg/biz" + "mayfly-go/pkg/ioc" "mayfly-go/pkg/req" "github.com/gin-gonic/gin" ) func InitAuthCertRouter(router *gin.RouterGroup) { - r := &api.AuthCert{AuthCertApp: application.GetAuthCertApp()} - ag := router.Group("sys/authcerts") + r := new(api.AuthCert) + biz.ErrIsNil(ioc.Inject(r)) + reqs := [...]*req.Conf{ req.NewGet("", r.AuthCerts).RequiredPermissionCode("authcert"), diff --git a/server/internal/machine/router/machine.go b/server/internal/machine/router/machine.go index e3a6adb6..1ccb5ed2 100644 --- a/server/internal/machine/router/machine.go +++ b/server/internal/machine/router/machine.go @@ -2,19 +2,16 @@ package router import ( "mayfly-go/internal/machine/api" - "mayfly-go/internal/machine/application" - tagapp "mayfly-go/internal/tag/application" + "mayfly-go/pkg/biz" + "mayfly-go/pkg/ioc" "mayfly-go/pkg/req" "github.com/gin-gonic/gin" ) func InitMachineRouter(router *gin.RouterGroup) { - m := &api.Machine{ - MachineApp: application.GetMachineApp(), - MachineTermOpApp: application.GetMachineTermOpApp(), - TagApp: tagapp.GetTagTreeApp(), - } + m := new(api.Machine) + biz.ErrIsNil(ioc.Inject(m)) machines := router.Group("machines") { diff --git a/server/internal/machine/router/machine_cronjob.go b/server/internal/machine/router/machine_cronjob.go index 4ef918b3..7db67377 100644 --- a/server/internal/machine/router/machine_cronjob.go +++ b/server/internal/machine/router/machine_cronjob.go @@ -2,7 +2,8 @@ package router import ( "mayfly-go/internal/machine/api" - "mayfly-go/internal/machine/application" + "mayfly-go/pkg/biz" + "mayfly-go/pkg/ioc" "mayfly-go/pkg/req" "github.com/gin-gonic/gin" @@ -10,9 +11,9 @@ import ( func InitMachineCronJobRouter(router *gin.RouterGroup) { cronjobs := router.Group("machine-cronjobs") - cj := &api.MachineCronJob{ - MachineCronJobApp: application.GetMachineCronJobApp(), - } + + cj := new(api.MachineCronJob) + biz.ErrIsNil(ioc.Inject(cj)) reqs := [...]*req.Conf{ // 获取机器任务列表 diff --git a/server/internal/machine/router/machine_file.go b/server/internal/machine/router/machine_file.go index 59877cb9..a5eff890 100644 --- a/server/internal/machine/router/machine_file.go +++ b/server/internal/machine/router/machine_file.go @@ -2,8 +2,8 @@ package router import ( "mayfly-go/internal/machine/api" - "mayfly-go/internal/machine/application" - msgapp "mayfly-go/internal/msg/application" + "mayfly-go/pkg/biz" + "mayfly-go/pkg/ioc" "mayfly-go/pkg/req" "github.com/gin-gonic/gin" @@ -12,10 +12,8 @@ import ( func InitMachineFileRouter(router *gin.RouterGroup) { machineFile := router.Group("machines") - mf := &api.MachineFile{ - MachineFileApp: application.GetMachineFileApp(), - MsgApp: msgapp.GetMsgApp(), - } + mf := new(api.MachineFile) + biz.ErrIsNil(ioc.Inject(mf)) reqs := [...]*req.Conf{ // 获取指定机器文件列表 diff --git a/server/internal/machine/router/machine_script.go b/server/internal/machine/router/machine_script.go index 20def008..8572c0fb 100644 --- a/server/internal/machine/router/machine_script.go +++ b/server/internal/machine/router/machine_script.go @@ -2,8 +2,8 @@ package router import ( "mayfly-go/internal/machine/api" - "mayfly-go/internal/machine/application" - tagapp "mayfly-go/internal/tag/application" + "mayfly-go/pkg/biz" + "mayfly-go/pkg/ioc" "mayfly-go/pkg/req" "github.com/gin-gonic/gin" @@ -11,11 +11,9 @@ import ( func InitMachineScriptRouter(router *gin.RouterGroup) { machines := router.Group("machines") - ms := &api.MachineScript{ - MachineScriptApp: application.GetMachineScriptApp(), - MachineApp: application.GetMachineApp(), - TagApp: tagapp.GetTagTreeApp(), - } + + ms := new(api.MachineScript) + biz.ErrIsNil(ioc.Inject(ms)) reqs := [...]*req.Conf{ // 获取指定机器脚本列表 diff --git a/server/internal/mongo/api/mongo.go b/server/internal/mongo/api/mongo.go index e8311725..d8af9355 100644 --- a/server/internal/mongo/api/mongo.go +++ b/server/internal/mongo/api/mongo.go @@ -23,8 +23,8 @@ import ( ) type Mongo struct { - MongoApp application.Mongo - TagApp tagapp.TagTree + MongoApp application.Mongo `inject:""` + TagApp tagapp.TagTree `inject:"TagTreeApp"` } func (m *Mongo) Mongos(rc *req.Ctx) { diff --git a/server/internal/mongo/application/application.go b/server/internal/mongo/application/application.go index 1e201171..efe4fb7c 100644 --- a/server/internal/mongo/application/application.go +++ b/server/internal/mongo/application/application.go @@ -2,13 +2,15 @@ package application import ( "mayfly-go/internal/mongo/infrastructure/persistence" - tagapp "mayfly-go/internal/tag/application" + "mayfly-go/pkg/ioc" ) -var ( - mongoApp Mongo = newMongoAppImpl(persistence.GetMongoRepo(), tagapp.GetTagTreeApp()) -) +func init() { + persistence.Init() + + ioc.Register(new(mongoAppImpl), ioc.WithComponentName("MongoApp")) +} func GetMongoApp() Mongo { - return mongoApp + return ioc.Get[Mongo]("MongoApp") } diff --git a/server/internal/mongo/application/mongo.go b/server/internal/mongo/application/mongo.go index 8c934185..6dde59ca 100644 --- a/server/internal/mongo/application/mongo.go +++ b/server/internal/mongo/application/mongo.go @@ -31,18 +31,15 @@ type Mongo interface { GetMongoConn(id uint64) (*mgm.MongoConn, error) } -func newMongoAppImpl(mongoRepo repository.Mongo, tagApp tagapp.TagTree) Mongo { - app := &mongoAppImpl{ - tagApp: tagApp, - } - app.Repo = mongoRepo - return app -} - type mongoAppImpl struct { base.AppImpl[*entity.Mongo, repository.Mongo] - tagApp tagapp.TagTree + TagApp tagapp.TagTree `inject:"TagTreeApp"` +} + +// 注入MongoRepo +func (d *mongoAppImpl) InjectMongoRepo(repo repository.Mongo) { + d.Repo = repo } // 分页获取数据库信息列表 @@ -63,7 +60,7 @@ func (d *mongoAppImpl) Delete(ctx context.Context, id uint64) error { }, func(ctx context.Context) error { var tagIds []uint64 - return d.tagApp.RelateResource(ctx, mongoEntity.Code, consts.TagResourceTypeMongo, tagIds) + return d.TagApp.RelateResource(ctx, mongoEntity.Code, consts.TagResourceTypeMongo, tagIds) }) } @@ -91,7 +88,7 @@ func (d *mongoAppImpl) SaveMongo(ctx context.Context, m *entity.Mongo, tagIds .. return d.Tx(ctx, func(ctx context.Context) error { return d.Insert(ctx, m) }, func(ctx context.Context) error { - return d.tagApp.RelateResource(ctx, resouceCode, consts.TagResourceTypeMongo, tagIds) + return d.TagApp.RelateResource(ctx, resouceCode, consts.TagResourceTypeMongo, tagIds) }) } @@ -109,7 +106,7 @@ func (d *mongoAppImpl) SaveMongo(ctx context.Context, m *entity.Mongo, tagIds .. return d.Tx(ctx, func(ctx context.Context) error { return d.UpdateById(ctx, m) }, func(ctx context.Context) error { - return d.tagApp.RelateResource(ctx, oldMongo.Code, consts.TagResourceTypeMongo, tagIds) + return d.TagApp.RelateResource(ctx, oldMongo.Code, consts.TagResourceTypeMongo, tagIds) }) } @@ -119,6 +116,6 @@ func (d *mongoAppImpl) GetMongoConn(id uint64) (*mgm.MongoConn, error) { if err != nil { return nil, errorx.NewBiz("mongo信息不存在") } - return me.ToMongoInfo(d.tagApp.ListTagPathByResource(consts.TagResourceTypeMongo, me.Code)...), nil + return me.ToMongoInfo(d.TagApp.ListTagPathByResource(consts.TagResourceTypeMongo, me.Code)...), nil }) } diff --git a/server/internal/mongo/infrastructure/persistence/persistence.go b/server/internal/mongo/infrastructure/persistence/persistence.go index cd7d69a8..bc9d51a0 100644 --- a/server/internal/mongo/infrastructure/persistence/persistence.go +++ b/server/internal/mongo/infrastructure/persistence/persistence.go @@ -2,12 +2,13 @@ package persistence import ( "mayfly-go/internal/mongo/domain/repository" + "mayfly-go/pkg/ioc" ) -var ( - mongoRepo repository.Mongo = newMongoRepo() -) +func Init() { + ioc.Register(newMongoRepo(), ioc.WithComponentName("MongoRepo")) +} func GetMongoRepo() repository.Mongo { - return mongoRepo + return ioc.Get[repository.Mongo]("MongoRepo") } diff --git a/server/internal/mongo/router/mongo.go b/server/internal/mongo/router/mongo.go index 5463fab6..691f557f 100644 --- a/server/internal/mongo/router/mongo.go +++ b/server/internal/mongo/router/mongo.go @@ -2,8 +2,8 @@ package router import ( "mayfly-go/internal/mongo/api" - "mayfly-go/internal/mongo/application" - tagapp "mayfly-go/internal/tag/application" + "mayfly-go/pkg/biz" + "mayfly-go/pkg/ioc" "mayfly-go/pkg/req" "github.com/gin-gonic/gin" @@ -12,10 +12,8 @@ import ( func InitMongoRouter(router *gin.RouterGroup) { m := router.Group("mongos") - ma := &api.Mongo{ - MongoApp: application.GetMongoApp(), - TagApp: tagapp.GetTagTreeApp(), - } + ma := new(api.Mongo) + biz.ErrIsNil(ioc.Inject(ma)) saveDataPerm := req.NewPermission("mongo:data:save") diff --git a/server/internal/msg/api/msg.go b/server/internal/msg/api/msg.go index d018c72f..cda659dc 100644 --- a/server/internal/msg/api/msg.go +++ b/server/internal/msg/api/msg.go @@ -9,7 +9,7 @@ import ( ) type Msg struct { - MsgApp application.Msg + MsgApp application.Msg `inject:""` } // 获取账号接收的消息列表 diff --git a/server/internal/msg/application/application.go b/server/internal/msg/application/application.go index 4dfcf630..e50923b7 100644 --- a/server/internal/msg/application/application.go +++ b/server/internal/msg/application/application.go @@ -2,12 +2,15 @@ package application import ( "mayfly-go/internal/msg/infrastructure/persistence" + "mayfly-go/pkg/ioc" ) -var ( - msgApp = newMsgApp(persistence.GetMsgRepo()) -) +func init() { + persistence.Init() + + ioc.Register(new(msgAppImpl), ioc.WithComponentName("MsgApp")) +} func GetMsgApp() Msg { - return msgApp + return ioc.Get[Msg]("MsgApp") } diff --git a/server/internal/msg/application/msg.go b/server/internal/msg/application/msg.go index 49e10fea..160be20a 100644 --- a/server/internal/msg/application/msg.go +++ b/server/internal/msg/application/msg.go @@ -19,27 +19,21 @@ type Msg interface { CreateAndSend(la *model.LoginAccount, msg *dto.SysMsg) } -func newMsgApp(msgRepo repository.Msg) Msg { - return &msgAppImpl{ - msgRepo: msgRepo, - } -} - type msgAppImpl struct { - msgRepo repository.Msg + MsgRepo repository.Msg `inject:""` } func (a *msgAppImpl) GetPageList(condition *entity.Msg, pageParam *model.PageParam, toEntity any, orderBy ...string) (*model.PageResult[any], error) { - return a.msgRepo.GetPageList(condition, pageParam, toEntity) + return a.MsgRepo.GetPageList(condition, pageParam, toEntity) } func (a *msgAppImpl) Create(ctx context.Context, msg *entity.Msg) { - a.msgRepo.Insert(ctx, msg) + a.MsgRepo.Insert(ctx, msg) } func (a *msgAppImpl) CreateAndSend(la *model.LoginAccount, wmsg *dto.SysMsg) { now := time.Now() msg := &entity.Msg{Type: 2, Msg: wmsg.Msg, RecipientId: int64(la.Id), CreateTime: &now, CreatorId: la.Id, Creator: la.Username} - a.msgRepo.Insert(context.TODO(), msg) + a.MsgRepo.Insert(context.TODO(), msg) ws.SendJsonMsg(ws.UserId(la.Id), wmsg.ClientId, wmsg) } diff --git a/server/internal/msg/infrastructure/persistence/persistence.go b/server/internal/msg/infrastructure/persistence/persistence.go index 43c28384..4ab172a3 100644 --- a/server/internal/msg/infrastructure/persistence/persistence.go +++ b/server/internal/msg/infrastructure/persistence/persistence.go @@ -1,11 +1,14 @@ package persistence -import "mayfly-go/internal/msg/domain/repository" - -var ( - msgRepo = newMsgRepo() +import ( + "mayfly-go/internal/msg/domain/repository" + "mayfly-go/pkg/ioc" ) -func GetMsgRepo() repository.Msg { - return msgRepo +func Init() { + ioc.Register(newMsgRepo(), ioc.WithComponentName("MsgRepo")) +} + +func GetMsgRepo() repository.Msg { + return ioc.Get[repository.Msg]("msgRepo") } diff --git a/server/internal/msg/router/msg.go b/server/internal/msg/router/msg.go index 844ab877..82e4f095 100644 --- a/server/internal/msg/router/msg.go +++ b/server/internal/msg/router/msg.go @@ -2,7 +2,7 @@ package router import ( "mayfly-go/internal/msg/api" - "mayfly-go/internal/msg/application" + "mayfly-go/pkg/ioc" "mayfly-go/pkg/req" "github.com/gin-gonic/gin" @@ -10,9 +10,9 @@ import ( func InitMsgRouter(router *gin.RouterGroup) { msg := router.Group("msgs") - a := &api.Msg{ - MsgApp: application.GetMsgApp(), - } + + a := new(api.Msg) + ioc.Inject(a) req.NewGet("/self", a.GetMsgs).Group(msg) } diff --git a/server/internal/msg/router/router.go b/server/internal/msg/router/router.go index 922b2f92..0cbfe7ec 100644 --- a/server/internal/msg/router/router.go +++ b/server/internal/msg/router/router.go @@ -1,6 +1,8 @@ package router -import "github.com/gin-gonic/gin" +import ( + "github.com/gin-gonic/gin" +) func Init(router *gin.RouterGroup) { InitMsgRouter(router) diff --git a/server/internal/redis/api/hash.go b/server/internal/redis/api/hash.go index dc155a73..b491fb9f 100644 --- a/server/internal/redis/api/hash.go +++ b/server/internal/redis/api/hash.go @@ -64,7 +64,7 @@ func (r *Redis) Hset(rc *req.Ctx) { rc.ResData = res } -func (r *Redis) SetHashValue(rc *req.Ctx) { +func (r *Redis) SaveHashValue(rc *req.Ctx) { g := rc.GinCtx hashValue := new(form.HashValue) ginx.BindJsonAndValid(g, hashValue) diff --git a/server/internal/redis/api/list.go b/server/internal/redis/api/list.go index 626a3726..8bd6d07e 100644 --- a/server/internal/redis/api/list.go +++ b/server/internal/redis/api/list.go @@ -54,7 +54,7 @@ func (r *Redis) SaveListValue(rc *req.Ctx) { } } -func (r *Redis) SetListValue(rc *req.Ctx) { +func (r *Redis) Lset(rc *req.Ctx) { g := rc.GinCtx listSetValue := new(form.ListSetValue) ginx.BindJsonAndValid(g, listSetValue) diff --git a/server/internal/redis/api/redis.go b/server/internal/redis/api/redis.go index fbd381a0..0b58676b 100644 --- a/server/internal/redis/api/redis.go +++ b/server/internal/redis/api/redis.go @@ -24,8 +24,8 @@ import ( ) type Redis struct { - RedisApp application.Redis - TagApp tagapp.TagTree + RedisApp application.Redis `inject:""` + TagApp tagapp.TagTree `inject:"TagTreeApp"` } func (r *Redis) RedisList(rc *req.Ctx) { diff --git a/server/internal/redis/api/set.go b/server/internal/redis/api/set.go index 483e225a..fc250f8d 100644 --- a/server/internal/redis/api/set.go +++ b/server/internal/redis/api/set.go @@ -17,7 +17,7 @@ func (r *Redis) GetSetValue(rc *req.Ctx) { rc.ResData = res } -func (r *Redis) SetSetValue(rc *req.Ctx) { +func (r *Redis) SaveSetValue(rc *req.Ctx) { g := rc.GinCtx keyvalue := new(form.SetValue) ginx.BindJsonAndValid(g, keyvalue) diff --git a/server/internal/redis/api/string.go b/server/internal/redis/api/string.go index 23a85970..2bd170a7 100644 --- a/server/internal/redis/api/string.go +++ b/server/internal/redis/api/string.go @@ -17,7 +17,7 @@ func (r *Redis) GetStringValue(rc *req.Ctx) { rc.ResData = str } -func (r *Redis) SetStringValue(rc *req.Ctx) { +func (r *Redis) SaveStringValue(rc *req.Ctx) { g := rc.GinCtx keyValue := new(form.StringValue) ginx.BindJsonAndValid(g, keyValue) diff --git a/server/internal/redis/application/application.go b/server/internal/redis/application/application.go index 7c369355..338ab59f 100644 --- a/server/internal/redis/application/application.go +++ b/server/internal/redis/application/application.go @@ -2,13 +2,15 @@ package application import ( "mayfly-go/internal/redis/infrastructure/persistence" - tagapp "mayfly-go/internal/tag/application" + "mayfly-go/pkg/ioc" ) -var ( - redisApp Redis = newRedisApp(persistence.GetRedisRepo(), tagapp.GetTagTreeApp()) -) +func init() { + persistence.Init() + + ioc.Register(new(redisAppImpl), ioc.WithComponentName("RedisApp")) +} func GetRedisApp() Redis { - return redisApp + return ioc.Get[Redis]("RedisApp") } diff --git a/server/internal/redis/application/redis.go b/server/internal/redis/application/redis.go index 3334e501..d2bc31be 100644 --- a/server/internal/redis/application/redis.go +++ b/server/internal/redis/application/redis.go @@ -35,18 +35,15 @@ type Redis interface { GetRedisConn(id uint64, db int) (*rdm.RedisConn, error) } -func newRedisApp(redisRepo repository.Redis, tagApp tagapp.TagTree) Redis { - app := &redisAppImpl{ - tagApp: tagApp, - } - app.Repo = redisRepo - return app -} - type redisAppImpl struct { base.AppImpl[*entity.Redis, repository.Redis] - tagApp tagapp.TagTree + TagApp tagapp.TagTree `inject:"TagTreeApp"` +} + +// 注入RedisRepo +func (r *redisAppImpl) InjectRedisRepo(repo repository.Redis) { + r.Repo = repo } // 分页获取redis列表 @@ -90,7 +87,7 @@ func (r *redisAppImpl) SaveRedis(ctx context.Context, re *entity.Redis, tagIds . return r.Tx(ctx, func(ctx context.Context) error { return r.Insert(ctx, re) }, func(ctx context.Context) error { - return r.tagApp.RelateResource(ctx, resouceCode, consts.TagResourceTypeRedis, tagIds) + return r.TagApp.RelateResource(ctx, resouceCode, consts.TagResourceTypeRedis, tagIds) }) } @@ -116,7 +113,7 @@ func (r *redisAppImpl) SaveRedis(ctx context.Context, re *entity.Redis, tagIds . return r.Tx(ctx, func(ctx context.Context) error { return r.UpdateById(ctx, re) }, func(ctx context.Context) error { - return r.tagApp.RelateResource(ctx, oldRedis.Code, consts.TagResourceTypeRedis, tagIds) + return r.TagApp.RelateResource(ctx, oldRedis.Code, consts.TagResourceTypeRedis, tagIds) }) } @@ -136,7 +133,7 @@ func (r *redisAppImpl) Delete(ctx context.Context, id uint64) error { return r.DeleteById(ctx, id) }, func(ctx context.Context) error { var tagIds []uint64 - return r.tagApp.RelateResource(ctx, re.Code, consts.TagResourceTypeRedis, tagIds) + return r.TagApp.RelateResource(ctx, re.Code, consts.TagResourceTypeRedis, tagIds) }) } @@ -151,6 +148,6 @@ func (r *redisAppImpl) GetRedisConn(id uint64, db int) (*rdm.RedisConn, error) { if err := re.PwdDecrypt(); err != nil { return nil, errorx.NewBiz(err.Error()) } - return re.ToRedisInfo(db, r.tagApp.ListTagPathByResource(consts.TagResourceTypeRedis, re.Code)...), nil + return re.ToRedisInfo(db, r.TagApp.ListTagPathByResource(consts.TagResourceTypeRedis, re.Code)...), nil }) } diff --git a/server/internal/redis/infrastructure/persistence/persistence.go b/server/internal/redis/infrastructure/persistence/persistence.go index 650210ca..2ccfd614 100644 --- a/server/internal/redis/infrastructure/persistence/persistence.go +++ b/server/internal/redis/infrastructure/persistence/persistence.go @@ -1,11 +1,14 @@ package persistence -import "mayfly-go/internal/redis/domain/repository" - -var ( - redisRepo repository.Redis = newRedisRepo() +import ( + "mayfly-go/internal/redis/domain/repository" + "mayfly-go/pkg/ioc" ) -func GetRedisRepo() repository.Redis { - return redisRepo +func Init() { + ioc.Register(newRedisRepo(), ioc.WithComponentName("RedisRepo")) +} + +func GetRedisRepo() repository.Redis { + return ioc.Get[repository.Redis]("RedisRepo") } diff --git a/server/internal/redis/router/redis.go b/server/internal/redis/router/redis.go index 80311079..18a6e084 100644 --- a/server/internal/redis/router/redis.go +++ b/server/internal/redis/router/redis.go @@ -2,8 +2,8 @@ package router import ( "mayfly-go/internal/redis/api" - "mayfly-go/internal/redis/application" - tagapp "mayfly-go/internal/tag/application" + "mayfly-go/pkg/biz" + "mayfly-go/pkg/ioc" "mayfly-go/pkg/req" "github.com/gin-gonic/gin" @@ -12,10 +12,8 @@ import ( func InitRedisRouter(router *gin.RouterGroup) { redis := router.Group("redis") - rs := &api.Redis{ - RedisApp: application.GetRedisApp(), - TagApp: tagapp.GetTagTreeApp(), - } + rs := new(api.Redis) + biz.ErrIsNil(ioc.Inject(rs)) // 保存数据权限 saveDataP := req.NewPermission("redis:data:save") @@ -61,7 +59,7 @@ func InitRedisRouter(router *gin.RouterGroup) { req.NewGet(":id/:db/string-value", rs.GetStringValue), // 设置string类型值 - req.NewPost(":id/:db/string-value", rs.SetStringValue).Log(req.NewLogSave("redis-setString")).RequiredPermission(saveDataP), + req.NewPost(":id/:db/string-value", rs.SaveStringValue).Log(req.NewLogSave("redis-setString")).RequiredPermission(saveDataP), // ———————————————— hash操作 ———————————————— req.NewGet(":id/:db/hscan", rs.Hscan), @@ -73,12 +71,12 @@ func InitRedisRouter(router *gin.RouterGroup) { req.NewDelete(":id/:db/hdel", rs.Hdel).Log(req.NewLogSave("redis-hdel")).RequiredPermission(deleteDataP), // 设置hash类型值 - req.NewPost(":id/:db/hash-value", rs.SetHashValue).Log(req.NewLogSave("redis-setHashValue")).RequiredPermission(saveDataP), + req.NewPost(":id/:db/hash-value", rs.SaveHashValue).Log(req.NewLogSave("redis-setHashValue")).RequiredPermission(saveDataP), // --------------- set操作 ---------------- req.NewGet(":id/:db/set-value", rs.GetSetValue), - req.NewPost(":id/:db/set-value", rs.SetSetValue).RequiredPermission(saveDataP), + req.NewPost(":id/:db/set-value", rs.SaveSetValue).RequiredPermission(saveDataP), req.NewGet(":id/:db/scard", rs.Scard), @@ -93,7 +91,7 @@ func InitRedisRouter(router *gin.RouterGroup) { req.NewPost(":id/:db/list-value", rs.SaveListValue).RequiredPermission(saveDataP), - req.NewPost(":id/:db/list-value/lset", rs.SetListValue).RequiredPermission(saveDataP), + req.NewPost(":id/:db/list-value/lset", rs.Lset).RequiredPermission(saveDataP), req.NewPost(":id/:db/lrem", rs.Lrem).RequiredPermission(deleteDataP), diff --git a/server/internal/sys/api/account.go b/server/internal/sys/api/account.go index 5e6e83c0..07d4595d 100644 --- a/server/internal/sys/api/account.go +++ b/server/internal/sys/api/account.go @@ -27,11 +27,11 @@ const ( ) type Account struct { - AccountApp application.Account - ResourceApp application.Resource - RoleApp application.Role - MsgApp msgapp.Msg - ConfigApp application.Config + AccountApp application.Account `inject:""` + ResourceApp application.Resource `inject:""` + RoleApp application.Role `inject:""` + MsgApp msgapp.Msg `inject:""` + ConfigApp application.Config `inject:""` } // 获取当前登录用户的菜单与权限码 diff --git a/server/internal/sys/api/config.go b/server/internal/sys/api/config.go index a564d4d0..0837238f 100644 --- a/server/internal/sys/api/config.go +++ b/server/internal/sys/api/config.go @@ -10,7 +10,7 @@ import ( ) type Config struct { - ConfigApp application.Config + ConfigApp application.Config `inject:""` } func (c *Config) Configs(rc *req.Ctx) { diff --git a/server/internal/sys/api/resource.go b/server/internal/sys/api/resource.go index 093e1de9..7c7f76f4 100644 --- a/server/internal/sys/api/resource.go +++ b/server/internal/sys/api/resource.go @@ -13,7 +13,7 @@ import ( ) type Resource struct { - ResourceApp application.Resource + ResourceApp application.Resource `inject:""` } func (r *Resource) GetAllResourceTree(rc *req.Ctx) { diff --git a/server/internal/sys/api/role.go b/server/internal/sys/api/role.go index 1d044e21..d49d6bca 100644 --- a/server/internal/sys/api/role.go +++ b/server/internal/sys/api/role.go @@ -15,8 +15,8 @@ import ( ) type Role struct { - RoleApp application.Role - ResourceApp application.Resource + RoleApp application.Role `inject:""` + ResourceApp application.Resource `inject:""` } func (r *Role) Roles(rc *req.Ctx) { diff --git a/server/internal/sys/api/syslog.go b/server/internal/sys/api/syslog.go index 0f7534ba..b907b3fe 100644 --- a/server/internal/sys/api/syslog.go +++ b/server/internal/sys/api/syslog.go @@ -9,7 +9,7 @@ import ( ) type Syslog struct { - SyslogApp application.Syslog + SyslogApp application.Syslog `inject:""` } func (r *Syslog) Syslogs(rc *req.Ctx) { diff --git a/server/internal/sys/application/account.go b/server/internal/sys/application/account.go index 3a8b114e..3b74c1dd 100644 --- a/server/internal/sys/application/account.go +++ b/server/internal/sys/application/account.go @@ -25,14 +25,15 @@ type Account interface { Delete(ctx context.Context, id uint64) error } -func newAccountApp(accountRepo repository.Account) Account { - return &accountAppImpl{base.AppImpl[*entity.Account, repository.Account]{Repo: accountRepo}} -} - type accountAppImpl struct { base.AppImpl[*entity.Account, repository.Account] } +// 注入AccountRepo +func (a *accountAppImpl) InjectAccountRepo(repo repository.Account) { + a.Repo = repo +} + func (a *accountAppImpl) GetPageList(condition *entity.Account, pageParam *model.PageParam, toEntity any, orderBy ...string) (*model.PageResult[any], error) { return a.GetRepo().GetPageList(condition, pageParam, toEntity) } diff --git a/server/internal/sys/application/application.go b/server/internal/sys/application/application.go index ef483919..e5894f4c 100644 --- a/server/internal/sys/application/application.go +++ b/server/internal/sys/application/application.go @@ -2,32 +2,35 @@ package application import ( "mayfly-go/internal/sys/infrastructure/persistence" + "mayfly-go/pkg/ioc" ) -var ( - accountApp = newAccountApp(persistence.GetAccountRepo()) - configApp = newConfigApp(persistence.GetConfigRepo()) - resourceApp = newResourceApp(persistence.GetResourceRepo()) - roleApp = newRoleApp(persistence.GetRoleRepo(), persistence.GetAccountRoleRepo()) - syslogApp = newSyslogApp(persistence.GetSyslogRepo()) -) +func init() { + persistence.Init() + + ioc.Register(new(accountAppImpl), ioc.WithComponentName("AccountApp")) + ioc.Register(new(roleAppImpl), ioc.WithComponentName("RoleApp")) + ioc.Register(new(configAppImpl), ioc.WithComponentName("ConfigApp")) + ioc.Register(new(resourceAppImpl), ioc.WithComponentName("ResourceApp")) + ioc.Register(new(syslogAppImpl), ioc.WithComponentName("SyslogApp")) +} func GetAccountApp() Account { - return accountApp + return ioc.Get[Account]("AccountApp") } func GetConfigApp() Config { - return configApp + return ioc.Get[Config]("ConfigApp") } func GetResourceApp() Resource { - return resourceApp + return ioc.Get[Resource]("ResourceApp") } func GetRoleApp() Role { - return roleApp + return ioc.Get[Role]("RoleApp") } func GetSyslogApp() Syslog { - return syslogApp + return ioc.Get[Syslog]("SyslogApp") } diff --git a/server/internal/sys/application/config.go b/server/internal/sys/application/config.go index 3244774d..782a501f 100644 --- a/server/internal/sys/application/config.go +++ b/server/internal/sys/application/config.go @@ -27,17 +27,14 @@ type Config interface { GetConfig(key string) *entity.Config } -func newConfigApp(configRepo repository.Config) Config { - configApp := new(configAppImpl) - configApp.Repo = configRepo - return configApp - // return &configAppImpl{base.AppImpl[*entity.Config, repository.Config]{Repo: configRepo}} -} - type configAppImpl struct { base.AppImpl[*entity.Config, repository.Config] } +func (a *configAppImpl) InjectConfigRepo(repo repository.Config) { + a.Repo = repo +} + func (a *configAppImpl) GetPageList(condition *entity.Config, pageParam *model.PageParam, toEntity any, orderBy ...string) (*model.PageResult[any], error) { return a.GetRepo().GetPageList(condition, pageParam, toEntity) } diff --git a/server/internal/sys/application/resource.go b/server/internal/sys/application/resource.go index 1baf2662..58751054 100644 --- a/server/internal/sys/application/resource.go +++ b/server/internal/sys/application/resource.go @@ -27,16 +27,15 @@ type Resource interface { GetAccountResources(accountId uint64, toEntity any) error } -func newResourceApp(resourceRepo repository.Resource) Resource { - return &resourceAppImpl{ - base.AppImpl[*entity.Resource, repository.Resource]{Repo: resourceRepo}, - } -} - type resourceAppImpl struct { base.AppImpl[*entity.Resource, repository.Resource] } +// 注入ResourceRepo +func (r *resourceAppImpl) InjectResourceRepo(repo repository.Resource) { + r.Repo = repo +} + func (r *resourceAppImpl) Save(ctx context.Context, resource *entity.Resource) error { // 更新操作 if resource.Id != 0 { diff --git a/server/internal/sys/application/role.go b/server/internal/sys/application/role.go index d65cd2d6..4f1a743d 100644 --- a/server/internal/sys/application/role.go +++ b/server/internal/sys/application/role.go @@ -41,24 +41,17 @@ type Role interface { GetRoleAccountPage(condition *entity.RoleAccountQuery, pageParam *model.PageParam, toEntity any, orderBy ...string) (*model.PageResult[any], error) } -func newRoleApp(roleRepo repository.Role, accountRoleRepo repository.AccountRole) Role { - return &roleAppImpl{ - roleRepo: roleRepo, - accountRoleRepo: accountRoleRepo, - } -} - type roleAppImpl struct { - roleRepo repository.Role - accountRoleRepo repository.AccountRole + RoleRepo repository.Role `inject:""` + AccountRoleRepo repository.AccountRole `inject:""` } func (m *roleAppImpl) GetPageList(condition *entity.RoleQuery, pageParam *model.PageParam, toEntity any, orderBy ...string) (*model.PageResult[any], error) { - return m.roleRepo.GetPageList(condition, pageParam, toEntity, orderBy...) + return m.RoleRepo.GetPageList(condition, pageParam, toEntity, orderBy...) } func (m *roleAppImpl) ListByQuery(condition *entity.RoleQuery) ([]*entity.Role, error) { - return m.roleRepo.ListByQuery(condition) + return m.RoleRepo.ListByQuery(condition) } func (m *roleAppImpl) SaveRole(ctx context.Context, role *entity.Role) error { @@ -69,14 +62,14 @@ func (m *roleAppImpl) SaveRole(ctx context.Context, role *entity.Role) error { } role.Status = 1 - return m.roleRepo.Insert(ctx, role) + return m.RoleRepo.Insert(ctx, role) } func (m *roleAppImpl) DeleteRole(ctx context.Context, id uint64) error { // 删除角色与资源账号的关联关系 return gormx.Tx( func(db *gorm.DB) error { - return m.roleRepo.DeleteByIdWithDb(ctx, db, id) + return m.RoleRepo.DeleteByIdWithDb(ctx, db, id) }, func(db *gorm.DB) error { return gormx.DeleteByWithDb(db, &entity.RoleResource{RoleId: id}) @@ -88,11 +81,11 @@ func (m *roleAppImpl) DeleteRole(ctx context.Context, id uint64) error { } func (m *roleAppImpl) GetRoleResourceIds(roleId uint64) []uint64 { - return m.roleRepo.GetRoleResourceIds(roleId) + return m.RoleRepo.GetRoleResourceIds(roleId) } func (m *roleAppImpl) GetRoleResources(roleId uint64, toEntity any) { - m.roleRepo.GetRoleResources(roleId, toEntity) + m.RoleRepo.GetRoleResources(roleId, toEntity) } func (m *roleAppImpl) SaveRoleResource(ctx context.Context, roleId uint64, resourceIds []uint64) { @@ -112,20 +105,20 @@ func (m *roleAppImpl) SaveRoleResource(ctx context.Context, roleId uint64, resou rr.IsDeleted = undeleted addVals = append(addVals, rr) } - m.roleRepo.SaveRoleResource(addVals) + m.RoleRepo.SaveRoleResource(addVals) for _, v := range delIds { - m.roleRepo.DeleteRoleResource(roleId, v) + m.RoleRepo.DeleteRoleResource(roleId, v) } } func (m *roleAppImpl) RelateAccountRole(ctx context.Context, accountId, roleId uint64, relateType consts.AccountRoleRelateType) error { accountRole := &entity.AccountRole{AccountId: accountId, RoleId: roleId} if relateType == consts.AccountRoleUnbind { - return m.accountRoleRepo.DeleteByCond(ctx, accountRole) + return m.AccountRoleRepo.DeleteByCond(ctx, accountRole) } - err := m.accountRoleRepo.GetBy(accountRole) + err := m.AccountRoleRepo.GetBy(accountRole) if err == nil { return errorx.NewBiz("该用户已拥有该权限") } @@ -135,15 +128,15 @@ func (m *roleAppImpl) RelateAccountRole(ctx context.Context, accountId, roleId u accountRole.Creator = la.Username accountRole.CreatorId = la.Id accountRole.CreateTime = &createTime - return m.accountRoleRepo.Insert(ctx, accountRole) + return m.AccountRoleRepo.Insert(ctx, accountRole) } func (m *roleAppImpl) GetAccountRoles(accountId uint64) ([]*entity.AccountRole, error) { var res []*entity.AccountRole - err := m.accountRoleRepo.ListByCond(&entity.AccountRole{AccountId: accountId}, &res) + err := m.AccountRoleRepo.ListByCond(&entity.AccountRole{AccountId: accountId}, &res) return res, err } func (m *roleAppImpl) GetRoleAccountPage(condition *entity.RoleAccountQuery, pageParam *model.PageParam, toEntity any, orderBy ...string) (*model.PageResult[any], error) { - return m.accountRoleRepo.GetPageList(condition, pageParam, toEntity, orderBy...) + return m.AccountRoleRepo.GetPageList(condition, pageParam, toEntity, orderBy...) } diff --git a/server/internal/sys/application/syslog.go b/server/internal/sys/application/syslog.go index 74c74519..bc113a00 100644 --- a/server/internal/sys/application/syslog.go +++ b/server/internal/sys/application/syslog.go @@ -20,18 +20,12 @@ type Syslog interface { SaveFromReq(req *req.Ctx) } -func newSyslogApp(syslogRepo repository.Syslog) Syslog { - return &syslogAppImpl{ - syslogRepo: syslogRepo, - } -} - type syslogAppImpl struct { - syslogRepo repository.Syslog + SyslogRepo repository.Syslog `inject:""` } func (m *syslogAppImpl) GetPageList(condition *entity.SysLogQuery, pageParam *model.PageParam, toEntity any, orderBy ...string) (*model.PageResult[any], error) { - return m.syslogRepo.GetPageList(condition, pageParam, toEntity, orderBy...) + return m.SyslogRepo.GetPageList(condition, pageParam, toEntity, orderBy...) } func (m *syslogAppImpl) SaveFromReq(req *req.Ctx) { @@ -76,5 +70,5 @@ func (m *syslogAppImpl) SaveFromReq(req *req.Ctx) { syslog.Type = entity.SyslogTypeNorman } - m.syslogRepo.Insert(req.MetaCtx, syslog) + m.SyslogRepo.Insert(req.MetaCtx, syslog) } diff --git a/server/internal/sys/infrastructure/persistence/account.go b/server/internal/sys/infrastructure/persistence/account.go index 9af83b62..daa8640b 100644 --- a/server/internal/sys/infrastructure/persistence/account.go +++ b/server/internal/sys/infrastructure/persistence/account.go @@ -8,15 +8,15 @@ import ( "mayfly-go/pkg/model" ) -type accountRepoImpl struct { +type AccountRepoImpl struct { base.RepoImpl[*entity.Account] } func newAccountRepo() repository.Account { - return &accountRepoImpl{base.RepoImpl[*entity.Account]{M: new(entity.Account)}} + return &AccountRepoImpl{base.RepoImpl[*entity.Account]{M: new(entity.Account)}} } -func (m *accountRepoImpl) GetPageList(condition *entity.Account, pageParam *model.PageParam, toEntity any, orderBy ...string) (*model.PageResult[any], error) { +func (m *AccountRepoImpl) GetPageList(condition *entity.Account, pageParam *model.PageParam, toEntity any, orderBy ...string) (*model.PageResult[any], error) { qd := gormx.NewQuery(new(entity.Account)). Like("name", condition.Name). Like("username", condition.Username) diff --git a/server/internal/sys/infrastructure/persistence/persistence.go b/server/internal/sys/infrastructure/persistence/persistence.go index 3c8292ce..3f9f4309 100644 --- a/server/internal/sys/infrastructure/persistence/persistence.go +++ b/server/internal/sys/infrastructure/persistence/persistence.go @@ -1,36 +1,39 @@ package persistence -import "mayfly-go/internal/sys/domain/repository" - -var ( - accountRepo = newAccountRepo() - configRepo = newConfigRepo() - resourceRepo = newResourceRepo() - roleRepo = newRoleRepo() - accountRoleRepo = newAccountRoleRepo() - syslogRepo = newSyslogRepo() +import ( + "mayfly-go/internal/sys/domain/repository" + "mayfly-go/pkg/ioc" ) +func Init() { + ioc.Register(newAccountRepo(), ioc.WithComponentName("AccountRepo")) + ioc.Register(newRoleRepo(), ioc.WithComponentName("RoleRepo")) + ioc.Register(newAccountRoleRepo(), ioc.WithComponentName("AccountRoleRepo")) + ioc.Register(newResourceRepo(), ioc.WithComponentName("ResourceRepo")) + ioc.Register(newConfigRepo(), ioc.WithComponentName("ConfigRepo")) + ioc.Register(newSyslogRepo(), ioc.WithComponentName("SyslogRepo")) +} + func GetAccountRepo() repository.Account { - return accountRepo + return ioc.Get[repository.Account]("AccountRepo") } func GetConfigRepo() repository.Config { - return configRepo + return ioc.Get[repository.Config]("ConfigRepo") } func GetResourceRepo() repository.Resource { - return resourceRepo + return ioc.Get[repository.Resource]("ResourceRepo") } func GetRoleRepo() repository.Role { - return roleRepo + return ioc.Get[repository.Role]("RoleRepo") } func GetAccountRoleRepo() repository.AccountRole { - return accountRoleRepo + return ioc.Get[repository.AccountRole]("AccountRoleRepo") } func GetSyslogRepo() repository.Syslog { - return syslogRepo + return ioc.Get[repository.Syslog]("SyslogRepo") } diff --git a/server/internal/sys/router/account.go b/server/internal/sys/router/account.go index 0e364351..2e5be81e 100644 --- a/server/internal/sys/router/account.go +++ b/server/internal/sys/router/account.go @@ -1,9 +1,9 @@ package router import ( - msgapp "mayfly-go/internal/msg/application" "mayfly-go/internal/sys/api" - "mayfly-go/internal/sys/application" + "mayfly-go/pkg/biz" + "mayfly-go/pkg/ioc" "mayfly-go/pkg/req" "github.com/gin-gonic/gin" @@ -11,13 +11,8 @@ import ( func InitAccountRouter(router *gin.RouterGroup) { account := router.Group("sys/accounts") - a := &api.Account{ - AccountApp: application.GetAccountApp(), - ResourceApp: application.GetResourceApp(), - RoleApp: application.GetRoleApp(), - MsgApp: msgapp.GetMsgApp(), - ConfigApp: application.GetConfigApp(), - } + a := new(api.Account) + biz.ErrIsNil(ioc.Inject(a)) addAccountPermission := req.NewPermission("account:add") diff --git a/server/internal/sys/router/config.go b/server/internal/sys/router/config.go index ad255cad..2eb8cb32 100644 --- a/server/internal/sys/router/config.go +++ b/server/internal/sys/router/config.go @@ -2,15 +2,17 @@ package router import ( "mayfly-go/internal/sys/api" - "mayfly-go/internal/sys/application" + "mayfly-go/pkg/biz" + "mayfly-go/pkg/ioc" "mayfly-go/pkg/req" "github.com/gin-gonic/gin" ) func InitSysConfigRouter(router *gin.RouterGroup) { - r := &api.Config{ConfigApp: application.GetConfigApp()} configG := router.Group("sys/configs") + r := new(api.Config) + biz.ErrIsNil(ioc.Inject(r)) baseP := req.NewPermission("config:base") diff --git a/server/internal/sys/router/resource.go b/server/internal/sys/router/resource.go index 4f2ba00c..3a78c107 100644 --- a/server/internal/sys/router/resource.go +++ b/server/internal/sys/router/resource.go @@ -2,15 +2,17 @@ package router import ( "mayfly-go/internal/sys/api" - "mayfly-go/internal/sys/application" + "mayfly-go/pkg/biz" + "mayfly-go/pkg/ioc" "mayfly-go/pkg/req" "github.com/gin-gonic/gin" ) func InitResourceRouter(router *gin.RouterGroup) { - r := &api.Resource{ResourceApp: application.GetResourceApp()} rg := router.Group("sys/resources") + r := new(api.Resource) + biz.ErrIsNil(ioc.Inject(r)) reqs := [...]*req.Conf{ req.NewGet("", r.GetAllResourceTree), diff --git a/server/internal/sys/router/role.go b/server/internal/sys/router/role.go index 0ee92490..75a725e2 100644 --- a/server/internal/sys/router/role.go +++ b/server/internal/sys/router/role.go @@ -2,18 +2,17 @@ package router import ( "mayfly-go/internal/sys/api" - "mayfly-go/internal/sys/application" + "mayfly-go/pkg/biz" + "mayfly-go/pkg/ioc" "mayfly-go/pkg/req" "github.com/gin-gonic/gin" ) func InitRoleRouter(router *gin.RouterGroup) { - r := &api.Role{ - RoleApp: application.GetRoleApp(), - ResourceApp: application.GetResourceApp(), - } rg := router.Group("sys/roles") + r := new(api.Role) + biz.ErrIsNil(ioc.Inject(r)) reqs := [...]*req.Conf{ req.NewGet("", r.Roles), diff --git a/server/internal/sys/router/router.go b/server/internal/sys/router/router.go index b94e305a..d93b14fc 100644 --- a/server/internal/sys/router/router.go +++ b/server/internal/sys/router/router.go @@ -1,6 +1,8 @@ package router -import "github.com/gin-gonic/gin" +import ( + "github.com/gin-gonic/gin" +) func Init(router *gin.RouterGroup) { InitCaptchaRouter(router) diff --git a/server/internal/sys/router/syslog.go b/server/internal/sys/router/syslog.go index 4c3bd543..fe784eee 100644 --- a/server/internal/sys/router/syslog.go +++ b/server/internal/sys/router/syslog.go @@ -2,17 +2,17 @@ package router import ( "mayfly-go/internal/sys/api" - "mayfly-go/internal/sys/application" + "mayfly-go/pkg/biz" + "mayfly-go/pkg/ioc" "mayfly-go/pkg/req" "github.com/gin-gonic/gin" ) func InitSyslogRouter(router *gin.RouterGroup) { - s := &api.Syslog{ - SyslogApp: application.GetSyslogApp(), - } sysG := router.Group("syslogs") + s := new(api.Syslog) + biz.ErrIsNil(ioc.Inject(s)) req.NewGet("", s.Syslogs).Group(sysG) } diff --git a/server/internal/sys/router/system.go b/server/internal/sys/router/system.go index 9f6c7740..4b46d307 100644 --- a/server/internal/sys/router/system.go +++ b/server/internal/sys/router/system.go @@ -2,13 +2,16 @@ package router import ( "mayfly-go/internal/sys/api" + "mayfly-go/pkg/biz" + "mayfly-go/pkg/ioc" "github.com/gin-gonic/gin" ) func InitSystemRouter(router *gin.RouterGroup) { - s := &api.System{} sys := router.Group("sysmsg") + s := new(api.System) + biz.ErrIsNil(ioc.Inject(s)) { sys.GET("", s.ConnectWs) diff --git a/server/internal/tag/api/tag_tree.go b/server/internal/tag/api/tag_tree.go index 383cb23e..7508b908 100644 --- a/server/internal/tag/api/tag_tree.go +++ b/server/internal/tag/api/tag_tree.go @@ -17,8 +17,8 @@ import ( ) type TagTree struct { - TagTreeApp application.TagTree - TagResourceApp application.TagResource + TagTreeApp application.TagTree `inject:""` + TagResourceApp application.TagResource `inject:""` } func (p *TagTree) GetTagTree(rc *req.Ctx) { diff --git a/server/internal/tag/api/team.go b/server/internal/tag/api/team.go index 6be11fed..0a578002 100644 --- a/server/internal/tag/api/team.go +++ b/server/internal/tag/api/team.go @@ -17,9 +17,9 @@ import ( ) type Team struct { - TeamApp application.Team - TagApp application.TagTree - AccountApp sys_applicaiton.Account + TeamApp application.Team `inject:""` + TagTreeApp application.TagTree `inject:""` + AccountApp sys_applicaiton.Account `inject:""` } func (p *Team) GetTeams(rc *req.Ctx) { @@ -131,7 +131,7 @@ func (p *Team) SaveTags(rc *req.Ctx) { for _, v := range addIds { tagId := v - tag, err := p.TagApp.GetById(new(entity.TagTree), tagId) + tag, err := p.TagTreeApp.GetById(new(entity.TagTree), tagId) biz.ErrIsNil(err, "存在非法标签id") ptt := &entity.TagTreeTeam{TeamId: teamId, TagId: tagId, TagPath: tag.CodePath} diff --git a/server/internal/tag/application/application.go b/server/internal/tag/application/application.go index dd988289..70db4718 100644 --- a/server/internal/tag/application/application.go +++ b/server/internal/tag/application/application.go @@ -2,32 +2,25 @@ package application import ( "mayfly-go/internal/tag/infrastructure/persistence" + "mayfly-go/pkg/ioc" ) -var ( - tagTreeApp TagTree = newTagTreeApp( - persistence.GetTagTreeRepo(), - GetTagResourceApp(), - persistence.GetTagTreeTeamRepo(), - ) +func init() { + persistence.Init() - teamApp Team = newTeamApp( - persistence.GetTeamRepo(), - persistence.GetTeamMemberRepo(), - persistence.GetTagTreeTeamRepo(), - ) - - tagResourceApp TagResource = newTagResourceApp(persistence.GetTagResourceRepo()) -) + ioc.Register(new(tagTreeAppImpl), ioc.WithComponentName("TagTreeApp")) + ioc.Register(new(teamAppImpl), ioc.WithComponentName("TeamApp")) + ioc.Register(new(tagResourceAppImpl), ioc.WithComponentName("TagResourceApp")) +} func GetTagTreeApp() TagTree { - return tagTreeApp + return ioc.Get[TagTree]("TagTreeApp") } func GetTeamApp() Team { - return teamApp + return ioc.Get[Team]("TeamApp") } func GetTagResourceApp() TagResource { - return tagResourceApp + return ioc.Get[TagResource]("TagResourceApp") } diff --git a/server/internal/tag/application/tag_resource.go b/server/internal/tag/application/tag_resource.go index 00aea752..867bd345 100644 --- a/server/internal/tag/application/tag_resource.go +++ b/server/internal/tag/application/tag_resource.go @@ -12,16 +12,15 @@ type TagResource interface { ListByQuery(condition *entity.TagResourceQuery, toEntity any) } -func newTagResourceApp(tagResourceRepo repository.TagResource) TagResource { - tagResourceApp := &tagResourceAppImpl{} - tagResourceApp.Repo = tagResourceRepo - return tagResourceApp -} - type tagResourceAppImpl struct { base.AppImpl[*entity.TagResource, repository.TagResource] } +// 注入TagResourceRepo +func (tr *tagResourceAppImpl) InjectTagResourceRepo(repo repository.TagResource) { + tr.Repo = repo +} + func (tr *tagResourceAppImpl) ListByQuery(condition *entity.TagResourceQuery, toEntity any) { tr.Repo.SelectByCondition(condition, toEntity) } diff --git a/server/internal/tag/application/tag_tree.go b/server/internal/tag/application/tag_tree.go index cf7121b8..1af66c36 100644 --- a/server/internal/tag/application/tag_tree.go +++ b/server/internal/tag/application/tag_tree.go @@ -51,23 +51,16 @@ type TagTree interface { CanAccess(accountId uint64, tagPath ...string) error } -func newTagTreeApp(tagTreeRepo repository.TagTree, - tagResourceApp TagResource, - tagTreeTeamRepo repository.TagTreeTeam, -) TagTree { - tagTreeApp := &tagTreeAppImpl{ - tagTreeTeamRepo: tagTreeTeamRepo, - tagResourceApp: tagResourceApp, - } - tagTreeApp.Repo = tagTreeRepo - return tagTreeApp -} - type tagTreeAppImpl struct { base.AppImpl[*entity.TagTree, repository.TagTree] - tagTreeTeamRepo repository.TagTreeTeam - tagResourceApp TagResource + TagTreeTeamRepo repository.TagTreeTeam `inject:""` + TagResourceApp TagResource `inject:""` +} + +// 注入TagTreeRepo +func (p *tagTreeAppImpl) InjectTagTreeRepo(tagTreeRepo repository.TagTree) { + p.Repo = tagTreeRepo } func (p *tagTreeAppImpl) Save(ctx context.Context, tag *entity.TagTree) error { @@ -82,7 +75,7 @@ func (p *tagTreeAppImpl) Save(ctx context.Context, tag *entity.TagTree) error { if err != nil { return errorx.NewBiz("父节点不存在") } - if p.tagResourceApp.CountByCond(&entity.TagResource{TagId: tag.Pid}) > 0 { + if p.TagResourceApp.CountByCond(&entity.TagResource{TagId: tag.Pid}) > 0 { return errorx.NewBiz("该父标签已关联资源, 无法添加子标签") } @@ -135,7 +128,7 @@ func (p *tagTreeAppImpl) GetAccountTagResources(accountId uint64, resourceType i tagResourceQuery.TagPath = tagPath tagResourceQuery.TagPathLikes = accountTagPaths - p.tagResourceApp.ListByQuery(tagResourceQuery, &tagResources) + p.TagResourceApp.ListByQuery(tagResourceQuery, &tagResources) return tagResources } @@ -155,14 +148,14 @@ func (p *tagTreeAppImpl) RelateResource(ctx context.Context, resourceCode string } // 如果tagIds为空数组,则为解绑该标签资源关联关系 if len(tagIds) == 0 { - return p.tagResourceApp.DeleteByCond(ctx, &entity.TagResource{ + return p.TagResourceApp.DeleteByCond(ctx, &entity.TagResource{ ResourceCode: resourceCode, ResourceType: resourceType, }) } var oldTagResources []*entity.TagResource - p.tagResourceApp.ListByQuery(&entity.TagResourceQuery{ResourceType: resourceType, ResourceCode: resourceCode}, &oldTagResources) + p.TagResourceApp.ListByQuery(&entity.TagResourceQuery{ResourceType: resourceType, ResourceCode: resourceCode}, &oldTagResources) var addTagIds, delTagIds []uint64 if len(oldTagResources) == 0 { @@ -188,7 +181,7 @@ func (p *tagTreeAppImpl) RelateResource(ctx context.Context, resourceCode string TagPath: tag.CodePath, }) } - if err := p.tagResourceApp.BatchInsert(ctx, addTagResource); err != nil { + if err := p.TagResourceApp.BatchInsert(ctx, addTagResource); err != nil { return err } } @@ -196,7 +189,7 @@ func (p *tagTreeAppImpl) RelateResource(ctx context.Context, resourceCode string if len(delTagIds) > 0 { for _, tagId := range delTagIds { cond := &entity.TagResource{ResourceCode: resourceCode, ResourceType: resourceType, TagId: tagId} - if err := p.tagResourceApp.DeleteByCond(ctx, cond); err != nil { + if err := p.TagResourceApp.DeleteByCond(ctx, cond); err != nil { return err } } @@ -207,7 +200,7 @@ func (p *tagTreeAppImpl) RelateResource(ctx context.Context, resourceCode string func (p *tagTreeAppImpl) ListTagPathByResource(resourceType int8, resourceCode string) []string { var trs []*entity.TagResource - p.tagResourceApp.ListByQuery(&entity.TagResourceQuery{ResourceType: resourceType, ResourceCode: resourceCode}, &trs) + p.TagResourceApp.ListByQuery(&entity.TagResourceQuery{ResourceType: resourceType, ResourceCode: resourceCode}, &trs) return collx.ArrayMap(trs, func(tr *entity.TagResource) string { return tr.TagPath }) @@ -220,7 +213,7 @@ func (p *tagTreeAppImpl) ListTagByPath(tagPaths ...string) []*entity.TagTree { } func (p *tagTreeAppImpl) ListTagByAccountId(accountId uint64) []string { - return p.tagTreeTeamRepo.SelectTagPathsByAccountId(accountId) + return p.TagTreeTeamRepo.SelectTagPathsByAccountId(accountId) } func (p *tagTreeAppImpl) CanAccess(accountId uint64, tagPath ...string) error { @@ -250,7 +243,7 @@ func (p *tagTreeAppImpl) Delete(ctx context.Context, id uint64) error { return errorx.NewBiz("您无权删除该标签") } - if p.tagResourceApp.CountByCond(&entity.TagResource{TagId: id}) > 0 { + if p.TagResourceApp.CountByCond(&entity.TagResource{TagId: id}) > 0 { return errorx.NewBiz("请先移除该标签关联的资源") } @@ -258,6 +251,6 @@ func (p *tagTreeAppImpl) Delete(ctx context.Context, id uint64) error { return p.DeleteById(ctx, id) }, func(ctx context.Context) error { // 删除该标签关联的团队信息 - return p.tagTreeTeamRepo.DeleteByCond(ctx, &entity.TagTreeTeam{TagId: id}) + return p.TagTreeTeamRepo.DeleteByCond(ctx, &entity.TagTreeTeam{TagId: id}) }) } diff --git a/server/internal/tag/application/team.go b/server/internal/tag/application/team.go index dc962263..d51b52e7 100644 --- a/server/internal/tag/application/team.go +++ b/server/internal/tag/application/team.go @@ -38,44 +38,33 @@ type Team interface { DeleteTag(tx context.Context, teamId, tagId uint64) error } -func newTeamApp(teamRepo repository.Team, - teamMemberRepo repository.TeamMember, - tagTreeTeamRepo repository.TagTreeTeam, -) Team { - return &teamAppImpl{ - teamRepo: teamRepo, - teamMemberRepo: teamMemberRepo, - tagTreeTeamRepo: tagTreeTeamRepo, - } -} - type teamAppImpl struct { - teamRepo repository.Team - teamMemberRepo repository.TeamMember - tagTreeTeamRepo repository.TagTreeTeam + TeamRepo repository.Team `inject:""` + TeamMemberRepo repository.TeamMember `inject:""` + TagTreeTeamRepo repository.TagTreeTeam `inject:""` } func (p *teamAppImpl) GetPageList(condition *entity.TeamQuery, pageParam *model.PageParam, toEntity any, orderBy ...string) (*model.PageResult[any], error) { - return p.teamRepo.GetPageList(condition, pageParam, toEntity, orderBy...) + return p.TeamRepo.GetPageList(condition, pageParam, toEntity, orderBy...) } func (p *teamAppImpl) Save(ctx context.Context, team *entity.Team) error { if team.Id == 0 { - return p.teamRepo.Insert(ctx, team) + return p.TeamRepo.Insert(ctx, team) } - return p.teamRepo.UpdateById(ctx, team) + return p.TeamRepo.UpdateById(ctx, team) } func (p *teamAppImpl) Delete(ctx context.Context, id uint64) error { return gormx.Tx( func(db *gorm.DB) error { - return p.teamRepo.DeleteByIdWithDb(ctx, db, id) + return p.TeamRepo.DeleteByIdWithDb(ctx, db, id) }, func(db *gorm.DB) error { - return p.teamMemberRepo.DeleteByCondWithDb(ctx, db, &entity.TeamMember{TeamId: id}) + return p.TeamMemberRepo.DeleteByCondWithDb(ctx, db, &entity.TeamMember{TeamId: id}) }, func(db *gorm.DB) error { - return p.tagTreeTeamRepo.DeleteByCondWithDb(ctx, db, &entity.TagTreeTeam{TeamId: id}) + return p.TagTreeTeamRepo.DeleteByCondWithDb(ctx, db, &entity.TagTreeTeam{TeamId: id}) }, ) } @@ -83,30 +72,30 @@ func (p *teamAppImpl) Delete(ctx context.Context, id uint64) error { // --------------- 团队成员相关接口 --------------- func (p *teamAppImpl) GetMemberPage(condition *entity.TeamMember, pageParam *model.PageParam, toEntity any) (*model.PageResult[any], error) { - return p.teamMemberRepo.GetPageList(condition, pageParam, toEntity) + return p.TeamMemberRepo.GetPageList(condition, pageParam, toEntity) } // 保存团队成员信息 func (p *teamAppImpl) SaveMember(ctx context.Context, teamMember *entity.TeamMember) { teamMember.Id = 0 - biz.IsTrue(!p.teamMemberRepo.IsExist(teamMember.TeamId, teamMember.AccountId), "该成员已存在") - p.teamMemberRepo.Insert(ctx, teamMember) + biz.IsTrue(!p.TeamMemberRepo.IsExist(teamMember.TeamId, teamMember.AccountId), "该成员已存在") + p.TeamMemberRepo.Insert(ctx, teamMember) } // 删除团队成员信息 func (p *teamAppImpl) DeleteMember(ctx context.Context, teamId, accountId uint64) { - p.teamMemberRepo.DeleteByCond(ctx, &entity.TeamMember{TeamId: teamId, AccountId: accountId}) + p.TeamMemberRepo.DeleteByCond(ctx, &entity.TeamMember{TeamId: teamId, AccountId: accountId}) } func (p *teamAppImpl) IsExistMember(teamId, accounId uint64) bool { - return p.teamMemberRepo.IsExist(teamId, accounId) + return p.TeamMemberRepo.IsExist(teamId, accounId) } -//--------------- 关联项目相关接口 --------------- +//--------------- 关联标签相关接口 --------------- func (p *teamAppImpl) ListTagIds(teamId uint64) []uint64 { tags := &[]entity.TagTreeTeam{} - p.tagTreeTeamRepo.ListByCondOrder(&entity.TagTreeTeam{TeamId: teamId}, tags) + p.TagTreeTeamRepo.ListByCondOrder(&entity.TagTreeTeam{TeamId: teamId}, tags) ids := make([]uint64, 0) for _, v := range *tags { ids = append(ids, v.TagId) @@ -117,10 +106,10 @@ func (p *teamAppImpl) ListTagIds(teamId uint64) []uint64 { // 保存关联项目信息 func (p *teamAppImpl) SaveTag(ctx context.Context, tagTreeTeam *entity.TagTreeTeam) error { tagTreeTeam.Id = 0 - return p.tagTreeTeamRepo.Insert(ctx, tagTreeTeam) + return p.TagTreeTeamRepo.Insert(ctx, tagTreeTeam) } // 删除关联项目信息 func (p *teamAppImpl) DeleteTag(ctx context.Context, teamId, tagId uint64) error { - return p.tagTreeTeamRepo.DeleteByCond(ctx, &entity.TagTreeTeam{TeamId: teamId, TagId: tagId}) + return p.TagTreeTeamRepo.DeleteByCond(ctx, &entity.TagTreeTeam{TeamId: teamId, TagId: tagId}) } diff --git a/server/internal/tag/infrastructure/persistence/persistence.go b/server/internal/tag/infrastructure/persistence/persistence.go index fdce24b4..fd460d64 100644 --- a/server/internal/tag/infrastructure/persistence/persistence.go +++ b/server/internal/tag/infrastructure/persistence/persistence.go @@ -1,31 +1,34 @@ package persistence -import "mayfly-go/internal/tag/domain/repository" - -var ( - tagTreeRepo repository.TagTree = newTagTreeRepo() - tagTreeTeamRepo repository.TagTreeTeam = newTagTreeTeamRepo() - tagResourceRepo repository.TagResource = newTagResourceRepo() - teamRepo repository.Team = newTeamRepo() - teamMemberRepo repository.TeamMember = newTeamMemberRepo() +import ( + "mayfly-go/internal/tag/domain/repository" + "mayfly-go/pkg/ioc" ) +func Init() { + ioc.Register(newTagTreeRepo(), ioc.WithComponentName("TagTreeRepo")) + ioc.Register(newTagTreeTeamRepo(), ioc.WithComponentName("TagTreeTeamRepo")) + ioc.Register(newTagResourceRepo(), ioc.WithComponentName("TagResourceRepo")) + ioc.Register(newTeamRepo(), ioc.WithComponentName("TeamRepo")) + ioc.Register(newTeamMemberRepo(), ioc.WithComponentName("TeamMemberRepo")) +} + func GetTagTreeRepo() repository.TagTree { - return tagTreeRepo + return ioc.Get[repository.TagTree]("TagTreeRepo") } func GetTagTreeTeamRepo() repository.TagTreeTeam { - return tagTreeTeamRepo + return ioc.Get[repository.TagTreeTeam]("TagTreeTeamRepo") } func GetTagResourceRepo() repository.TagResource { - return tagResourceRepo + return ioc.Get[repository.TagResource]("TagResourceRepo") } func GetTeamRepo() repository.Team { - return teamRepo + return ioc.Get[repository.Team]("TeamRepo") } func GetTeamMemberRepo() repository.TeamMember { - return teamMemberRepo + return ioc.Get[repository.TeamMember]("TeamMemberRepo") } diff --git a/server/internal/tag/router/tag_tree.go b/server/internal/tag/router/tag_tree.go index 81663ae4..9cf2fd93 100644 --- a/server/internal/tag/router/tag_tree.go +++ b/server/internal/tag/router/tag_tree.go @@ -2,17 +2,16 @@ package router import ( "mayfly-go/internal/tag/api" - "mayfly-go/internal/tag/application" + "mayfly-go/pkg/biz" + "mayfly-go/pkg/ioc" "mayfly-go/pkg/req" "github.com/gin-gonic/gin" ) func InitTagTreeRouter(router *gin.RouterGroup) { - m := &api.TagTree{ - TagTreeApp: application.GetTagTreeApp(), - TagResourceApp: application.GetTagResourceApp(), - } + m := new(api.TagTree) + biz.ErrIsNil(ioc.Inject(m)) tagTree := router.Group("/tag-trees") { diff --git a/server/internal/tag/router/team.go b/server/internal/tag/router/team.go index cdc27e14..56bbb4e0 100644 --- a/server/internal/tag/router/team.go +++ b/server/internal/tag/router/team.go @@ -1,20 +1,17 @@ package router import ( - sysapp "mayfly-go/internal/sys/application" "mayfly-go/internal/tag/api" - "mayfly-go/internal/tag/application" + "mayfly-go/pkg/biz" + "mayfly-go/pkg/ioc" "mayfly-go/pkg/req" "github.com/gin-gonic/gin" ) func InitTeamRouter(router *gin.RouterGroup) { - m := &api.Team{ - TeamApp: application.GetTeamApp(), - TagApp: application.GetTagTreeApp(), - AccountApp: sysapp.GetAccountApp(), - } + m := new(api.Team) + biz.ErrIsNil(ioc.Inject(m)) team := router.Group("/teams") { diff --git a/server/pkg/config/app.go b/server/pkg/config/app.go index 090b3b2f..509aec5f 100644 --- a/server/pkg/config/app.go +++ b/server/pkg/config/app.go @@ -4,7 +4,7 @@ import "fmt" const ( AppName = "mayfly-go" - Version = "v1.7.0" + Version = "v1.7.1" ) func GetAppInfo() string { diff --git a/server/pkg/ioc/component.go b/server/pkg/ioc/component.go new file mode 100644 index 00000000..772b758f --- /dev/null +++ b/server/pkg/ioc/component.go @@ -0,0 +1,28 @@ +package ioc + +type ComponentOption func(component *Component) + +// 组件名 +func WithComponentName(name string) ComponentOption { + return func(c *Component) { + c.Name = name + } +} + +// 组件 +type Component struct { + Name string // 组件名 + + Value any // 组件实例 +} + +func NewComponent(val any, opts ...ComponentOption) *Component { + component := &Component{ + Value: val, + } + + for _, o := range opts { + o(component) + } + return component +} diff --git a/server/pkg/ioc/default.go b/server/pkg/ioc/default.go new file mode 100644 index 00000000..639c89d6 --- /dev/null +++ b/server/pkg/ioc/default.go @@ -0,0 +1,20 @@ +package ioc + +// 全局默认实例容器 +var DefaultContainer = NewContainer() + +// 注册实例至全局默认ioc容器 +func Register(component any, opts ...ComponentOption) { + DefaultContainer.Register(component, opts...) +} + +// 根据组件名从全局默认ioc容器获取实例 +func Get[T any](name string) T { + c, _ := DefaultContainer.Get(name) + return c.(T) +} + +// 使用全局默认ioc容器中已注册的组件实例 -> 注入到指定实例所依赖的组件实例 +func Inject(component any) error { + return DefaultContainer.Inject(component) +} diff --git a/server/pkg/ioc/ioc.go b/server/pkg/ioc/ioc.go new file mode 100644 index 00000000..16d476c7 --- /dev/null +++ b/server/pkg/ioc/ioc.go @@ -0,0 +1,159 @@ +package ioc + +import ( + "errors" + "fmt" + "mayfly-go/pkg/logx" + "mayfly-go/pkg/utils/structx" + "reflect" + "strings" +) + +// 容器 +type Container struct { + components map[string]*Component +} + +func NewContainer() *Container { + return &Container{ + components: make(map[string]*Component), + } +} + +// 注册实例至实例容器 +func (c *Container) Register(bean any, opts ...ComponentOption) { + component := NewComponent(bean, opts...) + + componentName := component.Name + cType := structx.IndirectType(reflect.TypeOf(component.Value)) + // 组件名为空,则去组件类型名称作为组件名 + if componentName == "" { + componentName := cType.Name() + component.Name = componentName + } + + if _, err := c.Get(componentName); err == nil { + logx.Warnf("组件名[%s]已经注册至容器, 重复注册...", componentName) + } + + logx.Debugf("ioc register : %s = %s.%s", componentName, cType.PkgPath(), cType.Name()) + c.components[componentName] = component +} + +// 注册对象实例的字段含有inject:"xxx"标签或者Setter方法,则注入对应组件实例 +func (c *Container) Inject(obj any) error { + objValue := reflect.ValueOf(obj) + if err := c.injectWithField(objValue); err != nil { + return err + } + if err := c.injectWithMethod(objValue); err != nil { + return err + } + return nil +} + +// 对所有组件实例执行Inject。即为实例字段注入依赖的组件实例 +func (c *Container) InjectComponents() error { + for _, v := range c.components { + if err := c.Inject(v.Value); err != nil { + return err + } + } + return nil +} + +// 根据组件实例名,获取对应实例信息 +func (c *Container) Get(name string) (any, error) { + component, ok := c.components[name] + if !ok { + return nil, errors.New("component not found: " + name) + } + + return component.Value, nil +} + +// 根据实例字段的inject:"xxx"标签进行依赖注入 +func (c *Container) injectWithField(objValue reflect.Value) error { + objValue = structx.Indirect(objValue) + objType := objValue.Type() + + for i := 0; i < objType.NumField(); i++ { + field := objType.Field(i) + + componentName, ok := field.Tag.Lookup("inject") + if !ok { + continue + } + // inject tag字段名为空则默认为字段名 + if componentName == "" { + componentName = field.Name + } + + injectInfo := fmt.Sprintf("ioc field inject [%s -> %s.%s#%s]", componentName, objType.PkgPath(), objType.Name(), field.Name) + logx.Debugf(injectInfo) + + component, err := c.Get(componentName) + if err != nil { + return fmt.Errorf("%s error: %s", injectInfo, err.Error()) + } + + // 判断字段类型与需要注入的组件类型是否为可赋值关系 + componentType := reflect.TypeOf(component) + if !componentType.AssignableTo(field.Type) { + componentType = structx.IndirectType(componentType) + return fmt.Errorf("%s error: 注入类型不一致(期望类型->%s.%s, 组件类型->%s.%s)", injectInfo, field.Type.PkgPath(), field.Type.Name(), componentType.PkgPath(), componentType.Name()) + } + + objValueField := objValue.Field(i) + if !objValueField.IsValid() || !objValueField.CanSet() { + return fmt.Errorf("%s error: 字段无效或为不可导出类型", injectInfo) + } + + objValueField.Set(reflect.ValueOf(component)) + } + + return nil +} + +// 根据实例的Inject方法进行依赖注入 +func (c *Container) injectWithMethod(objValue reflect.Value) error { + objType := objValue.Type() + + for i := 0; i < objType.NumMethod(); i++ { + method := objType.Method(i) + + methodName := method.Name + // 不是以Inject开头的函数,则默认跳过 + if !strings.HasPrefix(methodName, "Inject") { + continue + } + + // 获取组件名,InjectTestApp -> TestApp + componentName := methodName[6:] + + injectInfo := fmt.Sprintf("ioc method inject [%s.%s#%s(%s)]", objType.Elem().PkgPath(), objType.Elem().Name(), methodName, componentName) + logx.Debugf(injectInfo) + + if method.Type.NumIn() != 2 { + logx.Warnf("%s error: 方法入参不为1个, 无法进行注入", injectInfo) + continue + } + + component, err := c.Get(componentName) + if err != nil { + return fmt.Errorf("%s error: %s", injectInfo, err.Error()) + } + + componentType := reflect.TypeOf(component) + // 期望的组件类型,即参数入参类型 + expectedComponentType := method.Type.In(1) + if !componentType.AssignableTo(expectedComponentType) { + componentType = structx.IndirectType(componentType) + return fmt.Errorf("%s error: 注入类型不一致(期望类型->%s.%s, 组件类型->%s.%s)", injectInfo, expectedComponentType.PkgPath(), expectedComponentType.Name(), componentType.PkgPath(), componentType.Name()) + } + + method.Func.Call([]reflect.Value{objValue, reflect.ValueOf(component)}) + } + + return nil +} diff --git a/server/resources/data/mayfly-go.sqlite b/server/resources/data/mayfly-go.sqlite index a05146c99eb265805f39e2c2a298c7ed6209b56e..292dcc643cab46bee215d0f146874b1bb0628ea1 100644 GIT binary patch delta 5864 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