godi di all
原来需要生成注入代码
注册时不会生成实例 只是注册了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() }