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

创建银行
创建开票

    Go实战全家桶之=====: GO依赖注入框架godi泛型接口、工业级巨匠开发者神器- ******

    编者: raymond@建设家园 阅读29 来源: abc 2025/05/31 04:28:27 文章 外链 公开

    工业级巨匠开发者  =======

     godi di all git clone https://gitee.com/leijmdas/gobase.git

    原来需要生成注入代码https://gitee.com/leijmdas/gobase.git

    注册时不会生成实例 只是注册了new方法

    现在直接调用方法 创建结构体实例

    编辑

    func (this *TestRedisSuite) Test030_FindBeanFactroy() {
        var c1 = basedi.FindBeanGeneral[*goelastic.GoElastic]()
        var c2 = basedi.FindBeanGeneral[*goelastic.GoElastic]()
        logrus.Info(c1, c2, c1 == c2)
    }
    package baseiface
    
    type IbaseProxy interface {
        ISingleton
        IBinding
        IpoolObj
    
        String() string
        ToString() string
        ToPrettyString() string
    
        FromJsonAny(body []byte) any
    
        ToJson() string
        ToJsonBytes() []byte
        ValueOf(another any)
    
        Log()
        Clone() any
        ContainsType(name string) bool
    }
    type GoElastic struct {
        basedto.BaseEntitySingle
        client *elasticsearch.Client
    
        Opened bool   `json:"opened"` 
    }
    
    func Default() *GoElastic {
        return baseutils.NewOfPtrTypeProxy[*GoElastic]()
    }
    
    func NewGoElasticCli() *GoElastic {
     
        return Default()
    }
    func (self *GoElastic) Init() {
        var err error
        var esdto = ichubconfig.FindBeanIchubConfig().ReadIchubEs()
        golog.Info(esdto)
        self.client, err = elasticsearch.NewClient(elasticsearch.Config{
           Addresses: strings.Split(esdto.URL, ","),
           Username:  esdto.Username,
           Password:  esdto.Password,
        })
        self.Opened = err == nil
    
        if err != nil {
           golog.Error("Error creating the client: ", err)
    
        }
    
    }
    package basedi
    
    import (
        "gitee.com/leijmdas/gobase/goconfig/common/base/baseiface"
        "gitee.com/leijmdas/gobase/goconfig/common/base/baseutils"
        "github.com/sirupsen/logrus"
        "reflect"
    )
    
    func FindBeanGeneral[T baseiface.IbaseProxy]() T {
        return NewBeanFactroy[T]().FindBeanGeneral()
    
    }
    
    type BeanFactroy[T baseiface.IbaseProxy] struct {
    }
    
    func (self *BeanFactroy[T]) FindBeanGeneral() T {
        var beanName, err = self.RegisterLoadBean()
        if err != nil {
           logrus.Error(err)
        }
        return FindBean(beanName).(T)
    }
    
    func (self *BeanFactroy[T]) RegisterLoadBean() (string, error) {
        var beanName = self.FindPkgNameOfAny()
        var err = RegisterLoadBean(beanName, self.LoadBeanGeneral)
        if err != nil {
           logrus.Error(err)
        }
        return beanName, err
    }
    func (self *BeanFactroy[T]) LoadBeanGeneral() baseiface.ISingleton {
        return self.NewOfPtrTypeProxy()
    }
    func NewBeanFactroy[T baseiface.IbaseProxy]() *BeanFactroy[T] {
        return &BeanFactroy[T]{}
    }
    func (self *BeanFactroy[T]) IfProxy(some any) bool {
        if some == nil {
           return false
        }
        if i, ok := some.(baseiface.IbaseProxy); ok {
           i.InitProxy(i)
           return ok
        }
        return false
    
    }
    func (self *BeanFactroy[T]) NewOfPtrTypeProxy() T {
    
        var ptr T
        var objType = reflect.TypeOf(ptr)
        if objType.Kind() != reflect.Ptr {
           var res = self.NewOfType()
           baseutils.IfProxy(res)
           res.Init()
           return res
        }
        var value = reflect.New(objType.Elem())
        var res = value.Interface().(T)
        baseutils.IfProxy(res)
        res.Init()
    
        return res
    
    }
    
    // no used
    func (self *BeanFactroy[T]) NewOfType() T {
        var ptr T
        baseutils.IfProxy(&ptr)
        ptr.Init()
        return ptr
    }
    func (self *BeanFactroy[T]) FindPkgNameOfAny() string {
        var value T
        // 使用reflect.TypeOf获取接口的动态类型
        ifaceType := reflect.TypeOf(value)
        // 检查是否是指针类型
        if ifaceType.Kind() == reflect.Ptr {
           // 取指针指向的类型
           ifaceType = ifaceType.Elem()
        }
        // 获取类型名称
        return ifaceType.Name() + "::" + ifaceType.PkgPath() + "." + ifaceType.Name()
    
    }
    func (self *BeanFactroy[T]) FindNameOfAny(value any) string {
    
        // 使用reflect.TypeOf获取接口的动态类型
        ifaceType := reflect.TypeOf(value)
        // 检查是否是指针类型
        if ifaceType.Kind() == reflect.Ptr {
           // 取指针指向的类型
           ifaceType = ifaceType.Elem()
        }
        // 获取类型名称
        return ifaceType.Name()
    
    }










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

    微信扫一扫:分享

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

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

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