This commit is contained in:
crusader 2018-03-15 23:32:45 +09:00
parent e92a9693a0
commit 219bb2f0c9
2 changed files with 51 additions and 7 deletions

View File

@ -5,6 +5,7 @@ import (
"reflect" "reflect"
cda "git.loafle.net/commons_go/di/annotation" cda "git.loafle.net/commons_go/di/annotation"
cdur "git.loafle.net/commons_go/di/util/reflect"
) )
type TypeDefinition struct { type TypeDefinition struct {
@ -22,9 +23,53 @@ func (td *TypeDefinition) GetAnnotation(name string) cda.Annotation {
if nil == td.TypeAnnotations { if nil == td.TypeAnnotations {
return nil return nil
} }
return td.TypeAnnotations[name] return td.TypeAnnotations[name]
} }
func (td *TypeDefinition) GetAnnotationByType(at reflect.Type, includeEmbedding bool) cda.Annotation {
if nil == td.TypeAnnotations {
return nil
}
for _, v := range td.TypeAnnotations {
if includeEmbedding {
if checkAnnotation(reflect.TypeOf(v), at) {
return v
}
} else {
if at == reflect.TypeOf(v) {
return v
}
}
}
return nil
}
func checkAnnotation(t reflect.Type, st reflect.Type) bool {
rt, _, _ := cdur.GetTypeInfo(t)
if reflect.Struct != rt.Kind() {
return false
}
for i := 0; i < rt.NumField(); i++ {
f := rt.Field(i)
if f.Anonymous {
if f.Type == st {
return true
}
if checkAnnotation(f.Type, st) {
return true
}
}
}
return false
}
type FieldDefinition struct { type FieldDefinition struct {
FieldName string FieldName string
PkgName string PkgName string

View File

@ -73,14 +73,13 @@ func (cr *defaultComponentRegistry) RegisterType(t reflect.Type) {
} }
cr.definitionByType[td.RealType] = td cr.definitionByType[td.RealType] = td
// _ca := ca.(*cdia.ComponentAnnotation) name := td.TypeName
ca := td.GetAnnotation(cdia.ComponentTag).(*cdia.Component)
name := "" if a := td.GetAnnotationByType(reflect.TypeOf((*cdia.Component)(nil)), true); nil != a {
if nil != ca && "" != strings.Trim(ca.Name, " ") { ca := a.(*cdia.Component)
name = ca.Name if "" != strings.Trim(ca.Name, " ") {
} else { name = ca.Name
name = td.TypeName }
} }
if eTD, ok := cr.definitionByName[name]; ok { if eTD, ok := cr.definitionByName[name]; ok {