go~大型项目的参数注册
目标对象
如何合理的注册 Config.Process 中的 Middleware ?
// 目标对象
type Config struct {
Process struct {
Middleware []CommonMiddleware
}
}
type CommonMiddleware interface {
PreProcess(ctx *context.Context, event *ProcessEvent) error
PostProcess(ctx *context.Context, err *error, event *ProcessEvent) error
}
SDK实现
提供 Init 函数
// 定义一个函数类型,后续要用该类型填充 Config
type CfgOption func(*Config)
func Init(name string, ops ...CfgOption) {
c := &Config{}
c.name = name
c.Producer.Middleware = []CommonMiddleware{}
for _, op := range ops {
op(c)
}
return c, nil
}
业务代码
定制注册
// 业务实现
type myMW struct{}
func (m *myMW) PreProcess(*context.Context, *ProcessEvent) error { return nil }
func (m *myMW) PostProcess(*context.Context, *error, *ProcessEvent) error { return nil }
// 注册
var processMWCfg = WithProcessMiddleware(&myMW{})
func WithProcessMiddleware(m CommonMiddleware) CfgOption {
return func(config *Config) {
config.Producer.Middleware = append(config.Producer.Middleware, m)
}
}
func WithProcessMW() CfgOption {
return processMWCfg
}
Init("123", WithProcessMW())
默认注册
type noOP struct{}
func (m *noOP) PreProcess(*context.Context, *ProcessEvent) error { return nil }
func (m *noOP) PostProcess(*context.Context, *error, *ProcessEvent) error { return nil }
type myMW struct{
noOP
addr string
email string
}