ioc:autowire:paramLoader(非必填)
string类型,表示需要定制的“参数加载器“类型名
参数加载器由结构定义者可选定制。可参考:extension/state/redis
参数加载器需要实现Load方法:
// ParamLoader is interface to load param
type ParamLoader interface {
Load(sd *StructDescriptor, fi *FieldInfo) (interface{}, error)
}
定义结构的开发者可以通过实现参数加载器,来定义自己的结构初始化参数。例如,一个 redis 客户端结构 'Impl',需要从Config 参数来加载,如下所示 New 方法。
type Config struct {
Address string
Password string
DB string
}
func (c *Config) New(impl *Impl) (*Impl, error) {
dbInt, err := strconv.Atoi(c.DB)
if err != nil {
return impl, err
}
client := redis.NewClient(&redis.Options{
Addr: c.Address,
Password: c.Password,
DB: dbInt,
})
_, err = client.Ping().Result()
if err != nil {
return impl, err
}
impl.client = client
return impl, nil
}
Config 包含的三个字段:Address Password DB,需要由使用者传入。
从哪里传入?这就是参数加载器所做的事情。
结构定义者可以定义如下加载器,从而将字段通过注入该结构的 tag 标签获取,如果tag信息标注了配置位置,则通过配置文件获取。
type paramLoader struct {
}
func (p *paramLoader) Load(sd *autowire.StructDescriptor, fi *autowire.FieldInfo) (interface{}, error) {
splitedTagValue := strings.Split(fi.TagValue, ",")
param := &Config{}
if len(splitedTagValue) == 1 {
return nil, fmt.Errorf("file info %s doesn't contain param infomration, create param from sd paramLoader failed", fi)
}
if err := config.LoadConfigByPrefix("extension.normal.redis."+splitedTagValue[1], param); err != nil {
return nil, err
}
return param, nil
}
例如
type App struct {
NormalDB3Redis normalRedis.Redis `normal:"github.com/cc-cheunggg/ioc-golang/extension/state/redis.Redis,address=127.0.0.1:6379&db=3"`
}
当然也可以从配置文件读入,tag中指定了key为 db1-redis
type App struct {
NormalDB3Redis normalRedis.Redis `normal:"github.com/cc-cheunggg/ioc-golang/extension/state/redis.Redis,db1-redis"`
}
ioc-go.yaml: autowire.normal.Redis.Impl.db1-redis.param 读入参数
autowire:
normal:
github.com/cc-cheunggg/ioc-golang/extension/state/redis.Redis:
db1-redis:
param:
address: localhost:6379
db: 1
我们提供了预置的参数加载器
除非用户有强烈需求,我们更推荐用户直接使用我们预置的参数加载器:http://github.com/cc-cheunggg/ioc-golang/tree/master/autowire/param_loader。
我们会先后尝试:标签重定向到配置、标签读入参数、配置文件的默认位置读入参数。每个注册到框架的结构都有唯一的ID,因此也会在配置文件中拥有配置参数的位置,这一默认位置在这里定义:http://github.com/cc-cheunggg/ioc-golang/blob/master/autowire/param_loader/default_config.go#L21,我们更希望和用户约定好这一点。
当所有加载器都加载参数失败后,将会抛出错误。使用者应当查阅自己引入的结构加载器实现,并按照要求配置好参数。