深入 Wire:基于反射的依赖注入容器定制
本教程讲解 Google Wire 在编译期注入之外的另一种路径:通过反射机制实现运行时依赖注入。将覆盖 reflect 包构建注入器、处理接口绑定、生命周期管理。 · 难度:入门 · +10XP
深入 Wire:基于反射的依赖注入容器定制
大多数 Go 依赖注入教程停留在 Wire 的编译期代码生成。本教程另辟蹊径,使用 reflect 包构建一个轻量级运行时 DI 容器,支持按名称注入、单例/多例作用域、延迟初始化。你将学到如何安全地利用 reflect.New、reflect.Call,如何处理 error 返回,并通过合理的设计避免反射带来的性能过热。
type Container struct {
providers map[string]reflect.Value
instances map[string]reflect.Value
}
func (c *Container) Provide(name string, fn interface{}) {
c.providers[name] = reflect.ValueOf(fn)
}
func (c *Container) Resolve(name string) interface{} {
if inst, ok := c.instances[name]; ok {
return inst.Interface()
}
fn := c.providers[name]
results := fn.Call(nil)
if err := results[1].Interface(); err != nil {
panic(err)
}
c.instances[name] = results[0]
return results[0].Interface()
}