Go实战全家桶之二: GO依赖注入框架godi之十,实现BEAN工厂泛型接口,无需godi生成代码

1163e99bc6fe21212bb5b9d188165cce.png

godi di all

原来需要生成注入代码

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

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

7cfa536eb4314126a6b8f1088dc4bc98.png

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

}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leijmdas

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值