gitee.com/lh-her-team/common@v1.5.1/container/option.go (about) 1 package container 2 3 import ( 4 "errors" 5 "reflect" 6 ) 7 8 type Option func(*binding) error 9 10 //Name 指定binding的name 11 func Name(name string) Option { 12 return func(b *binding) error { 13 b.name = name 14 return nil 15 } 16 } 17 18 //Optional 指定构造函数中哪些参数是可选的,即使没有Resolve出来,设置为nil即可,也不报错 19 func Optional(index ...int) Option { 20 return func(b *binding) error { 21 b.optionalIndexes = make(map[int]bool) 22 for _, i := range index { 23 b.optionalIndexes[i] = true 24 } 25 return nil 26 } 27 } 28 29 //Interface 指定注册时构造函数返回对象对应的接口指针 30 //比如将Logger这个interface传入,代码为: 31 // var l *Logger 32 // Interface(l) 33 func Interface(it ...interface{}) Option { 34 return func(b *binding) error { 35 for _, i := range it { 36 if i == nil { 37 b.resolveTypes = append(b.resolveTypes, nil) 38 } 39 ptr := reflect.TypeOf(i) 40 if ptr == nil || ptr.Kind() != reflect.Ptr { 41 return errors.New("interface input must be a interface point") 42 } 43 t := ptr.Elem() 44 b.resolveTypes = append(b.resolveTypes, t) 45 } 46 return nil 47 } 48 } 49 50 //Lifestyle 指定在获得接口对应的实例时,是单例还是临时的 51 func Lifestyle(isTransient bool) Option { 52 return func(b *binding) error { 53 b.isTransient = isTransient 54 return nil 55 } 56 } 57 58 //DependsOn 指定这个构造函数依赖的接口对应的name 59 func DependsOn(dependsOn map[int]string) Option { 60 return func(b *binding) error { 61 b.dependsOn = dependsOn 62 return nil 63 } 64 } 65 66 //Parameters 指定这个构造函数的参数值 67 func Parameters(p map[int]interface{}) Option { 68 return func(b *binding) error { 69 b.specifiedParameters = p 70 return nil 71 } 72 } 73 74 //Default 指定这个接口对应构造函数是不是默认的映射 75 func Default() Option { 76 return func(b *binding) error { 77 b.isDefault = true 78 return nil 79 } 80 } 81 82 type ResolveOption func(*resolveOption) error 83 type resolveOption struct { 84 name string 85 args map[int]interface{} 86 dependsOn map[int]string 87 } 88 89 //Arguments 指定在获得某接口的实例时,该实例构造函数的值 90 func Arguments(p map[int]interface{}) ResolveOption { 91 return func(option *resolveOption) error { 92 option.args = p 93 return nil 94 } 95 } 96 97 //ResolveName 指定在获得接口实例时,使用哪个name对应的构造函数 98 func ResolveName(name string) ResolveOption { 99 return func(option *resolveOption) error { 100 option.name = name 101 return nil 102 } 103 } 104 105 type CallOption func(*resolveOption) error 106 107 func CallArguments(p map[int]interface{}) CallOption { 108 return func(option *resolveOption) error { 109 option.args = p 110 return nil 111 } 112 } 113 114 //CallDependsOn 指定这个构造函数依赖的接口对应的name 115 func CallDependsOn(dependsOn map[int]string) CallOption { 116 return func(option *resolveOption) error { 117 option.dependsOn = dependsOn 118 return nil 119 } 120 }