Go全家桶规划之二: GO依赖注入框架godi之六,实现BEAN注册容器、 自动注入, 工业级巨匠
作者:
雷建明@芯速配 阅读426 2024/09/29 07:07:42 文章 原创 公开
GO全家桶测试驱动学习
编辑
编辑
gonats总体架构:
编辑
开源代码:go1.20
https://gitee.com/ichub/gonats.git
编辑
使用技术GO元编程:goast解析tag 函数 imports 结构体等
使用goconfig处理配置文件viper有使用, 聚合根:
编辑
定义结构体与成员:
package single
import (
"gitee.com/ichub/goconfig/common/base/basedto"
"gitee.com/ichub/goconfig/common/base/baseiface"
"gitee.com/ichub/goconfig/common/ichublog"
"gitee.com/ichub/godi/di/dimodel/multi"
"github.com/sirupsen/logrus"
)
type SingleEntity struct {
basedto.BaseEntitySingle// 以下是依赖注入的示例 // 注入的对象可以是单例、绑定、新建、无注入 //auto 通过LoadBean()方法注入 MultiAuto *multi.MultiEntity `godi:"auto"` //bind 通过BindUp()方法注入 MultiBind *multi.MultiEntity `godi:"bind"` //new 通过New()方法注入 MultiNew *multi.MultiEntity `godi:"new"` //none 不注入 MultiNone *multi.MultiEntity `godi:"none"` //single 单例; 注入的对象为简单NEW MultiSingle *multi.MultiEntity `godi:"single"`
Id int
Name string
}
// 注册一个成员加载函数
func (this *SingleEntity) Bind() {
this.BindUp("MultiBind", multi.LoadMultiEntity)
=》成员名称对应结构体加载函数}
func NewSingleEntity() *SingleEntity {
var s = &SingleEntity{
Name: "single",
}
s.InitProxy(s)
return s
}指定结构体structName生成注册与注入代码:测试用例
func (this *TestDiFactoySuite) Test002_MakeDiStru() {
this.DiFactroy.Rootdir = fileutils.FindRootDirGoMod()
this.DiFactroy.MakeDiStru("SingleEntity")
}// 生成所有, 继承baseentity的结果: 已经有不再生成!
func (this *TestDiFactoySuite) Test003_MakeDiAll() {
this.DiFactroy.MakeDiAll()
}
// 生成所有 继承baseentity的结果,强制执行
func (this *TestDiFactoySuite) Test004_MakeDiForce() {
this.DiFactroy.MakeDiAllForce(true)
}// 指定一个文件生成
func (this *TestDiFactoySuite) Test001_MakeDiFile() {
this.DiFactroy.MakeDiFile("./difactroy/di_factroy.go")
logrus.Info(CurrentFile())
}// 指定结构体structName生成注册与注入代码
func (this *TestDiFactoySuite) Test002_MakeDiStru() {
this.DiFactroy.Rootdir = fileutils.FindRootDirGoMod()
this.DiFactroy.MakeDiStru("SingleEntity")
}同目录生成注册代码
package single import ( "gitee.com/ichub/goconfig/common/base/baseiface" "gitee.com/ichub/goconfig/common/basedi" "gitee.com/ichub/godi/di/dimodel/multi" "github.com/sirupsen/logrus" )
/* @Title 文件名称: single_entity_init.go @Desp 描述: 自动注册注入 @Author 作者: leijmdas@163.com 时间(2024-04-23 01:59:02) @Update 作者: leijmdas@163.com 时间(2024-04-23 01:59:02) */
const single_nameSingleEntity = "SingleEntity"
// init register load
func init() {
registerBeanSingleEntity()
}
// register SingleEntity
func registerBeanSingleEntity() {
basedi.RegisterLoadBean(single_nameSingleEntity, LoadSingleEntity)
}
func FindBeanSingleEntity() *SingleEntity {
return basedi.FindBean(single_nameSingleEntity).(*SingleEntity)
}
func LoadSingleEntity() baseiface.ISingleton {
var s = NewSingleEntity()
InjectSingleEntity(s)
return s
}
func InjectSingleEntity(s *SingleEntity) {
// tag `godi:"none"` 则不注入!
// tag `godi:"auto"`
s.MultiAuto = multi.FindBeanMultiEntity()
// tag `godi:"new"`
s.MultiNew = multi.NewMultiEntity()
// tag `godi:"single"`
s.MultiSingle = &multi.MultiEntity{}
// tag `godi:"bind"` 通过绑定函数注入
s.Bind()
var find = s.FindBinding("MultiBind")
if find != nil {
logrus.Debug("find binded LoadBeanMultiEntity!")
s.MultiBind = find().(*multi.MultiEntity)
} else {
s.MultiBind = &multi.MultiEntity{}
logrus.Error("no binding LoadBeanMultiEntity!")
}
logrus.Debug("inject")
}生成代码的文件信息json
编辑
{
"isBaseEntiyStruct": true,
"fullPkg": "gitee.com/ichub/godi/di/dimodel/single",
"ExistNewStruct": true,
"NewStructName": "NewSingleEntity",
"pkg_name": "single",
"struct_name": "SingleEntity",
"pathFile": "D:\\go-ichub\\go\\godi\\di\\dimodel\\single\\single_entity.go",
"out_path": "./",
"out_file": "",
"importedLibs": [
"gitee.com/ichub/goconfig/common/base/basedto",
"gitee.com/ichub/goconfig/common/base/baseiface",
"gitee.com/ichub/goconfig/common/ichublog",
"gitee.com/ichub/godi/di/dimodel/multi",
"github.com/sirupsen/logrus"
],
"diInjects": {
"BaseEntitySingle": {
"injectMod": 3,
"tag": "",
"injectCode": "",
"goType": "struct",
"importLib": "",
"memberName": "BaseEntitySingle",
"memberType": "BaseEntitySingle",
"pkgName": "basedto"
},
"Id": {
"injectMod": 2,
"tag": "",
"injectCode": "",
"goType": "int",
"importLib": "",
"memberName": "Id",
"memberType": "int",
"pkgName": ""
},
"MultiAuto": {
"injectMod": 3,
"tag": "auto",
"injectCode": "s.MultiAuto = multi.FindBeanMultiEntity()",
"goType": "struct",
"importLib": "gitee.com/ichub/godi/di/dimodel/multi",
"memberName": "MultiAuto",
"memberType": "MultiEntity",
"pkgName": "multi"
},
"MultiBind": {
"injectMod": 5,
"tag": "bind",
"injectCode": "\n\ts.Bind()\n\tvar find = s.FindBinding(\"MultiBind\")\n\tif find != nil {\n\t\tlogrus.Debug(\"find binded LoadBeanMultiEntity!\")\n\t\ts.MultiBind = find().(*multi.MultiEntity)\n\t} else {\n\t\ts.MultiBind = \u0026multi.MultiEntity{}\n\t\tlogrus.Error(\"no binding LoadBeanMultiEntity!\")\n\t}",
"goType": "struct",
"importLib": "gitee.com/ichub/godi/di/dimodel/multi",
"memberName": "MultiBind",
"memberType": "MultiEntity",
"pkgName": "multi"
},
"MultiNew": {
"injectMod": 4,
"tag": "new",
"injectCode": "s.MultiNew = multi.NewMultiEntity()",
"goType": "struct",
"importLib": "gitee.com/ichub/godi/di/dimodel/multi",
"memberName": "MultiNew",
"memberType": "MultiEntity",
"pkgName": "multi"
},
"MultiNone": {
"injectMod": 2,
"tag": "none",
"injectCode": "",
"goType": "struct",
"importLib": "",
"memberName": "MultiNone",
"memberType": "MultiEntity",
"pkgName": "multi"
},
"Name": {
"injectMod": 2,
"tag": "",
"injectCode": "",
"goType": "string",
"importLib": "",
"memberName": "Name",
"memberType": "string",
"pkgName": ""
}
},
"force_build": false,
"methodNames": [
"Bind",
"Autoload",
"AutoInject",
"Check"
],
"fields": [
"BaseEntitySingle",
"MultiAuto",
"MultiNew",
"MultiBind",
"MultiNone",
"Id",
"Name"
]
}服务部署
编辑
用例位置
编辑
自动配置
编辑
声明:本网站部分内容来源于网络,版权归原权利人所有,其观点不代表本网站立场;本网站视频或图片制作权归当前商户及其作者,涉及未经授权的制作均须标记“样稿”。如内容侵犯了您相关权利,请及时联系责任编辑(研发之家)
成员
李洪奎
@芯速配 ,版权号: - 成交数 --
- 成交额 --
- 应答率
聊天 收藏 点赞
验证
二维码支付