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  }