最佳体验请使用Chrome67及以上版本、火狐、Edge、Safari浏览器 ×

创建银行
创建开票

    Go全家桶规划之二: GO依赖注入框架godi之六,实现BEAN注册容器、 自动注入, 工业级巨匠

    作者: 雷建明@芯速配 阅读426 2024/09/29 07:07:42 文章 原创 公开

     GO全家桶测试驱动学习

    编辑

    f4e02b0a82bd4d55955a0468e2db1694.png编辑

    gonats总体架构:

    编辑

    开源代码:go1.20

    ichub/godi

    https://gitee.com/ichub/gonats.git

    a01f9dd053df48268263cc78b2948ef6.png编辑

    使用技术GO元编程:goast解析tag 函数 imports 结构体等

    使用goconfig处理配置文件viper有使用, 聚合根:

    ce6002ae9e9d40f1ae2495855f4943aa.png编辑

    定义结构体与成员:

    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

    d58a6bc3a159420bb24642904ab38c3d.png编辑

    {
         "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"
         ]
    }

    服务部署

    b8b6a5322a3e42bd9b5aeb11c8e6abeb.png编辑

    用例位置

    886e8d961c2043d29846ebc1b564d340.png编辑


     自动配置

    66af6481c15445b4aa2ec2501d4815a1.png编辑






    声明:本网站部分内容来源于网络,版权归原权利人所有,其观点不代表本网站立场;本网站视频或图片制作权归当前商户及其作者,涉及未经授权的制作均须标记“样稿”。如内容侵犯了您相关权利,请及时联系责任编辑(研发之家)
    李洪奎
    @芯速配 ,版权号:
    成员
    • 成交数 --
    • 成交额 --
    • 应答率
    聊天 收藏 点赞
    赏
    ¥0.00¥0.00¥0.00¥0.00¥0.00
     0  0
    
    
    分享

    微信扫一扫:分享

    微信里点“+”,扫一扫二维码

    便可将本文分享至朋友圈。

        0
      验证
      二维码支付