Go 中增强的依赖注入模式
在 Go 中,连接组件的传统方法是在 main 函数中手动实例化并传递依赖项,如给定代码所示。虽然此方法很实用,但随着代码库的增长,它可能会变得麻烦且容易出错。
要解决此问题,值得考虑替代模式:
1。函数参数
将依赖项作为函数参数传递。这通过允许轻松模拟依赖关系来简化测试。
func someConsumer(g Guy) { fmt.Println("Hello, " + g.SomeDumbGuy()) } func main() { var d datstr someConsumer(d) }
2.工厂函数
创建返回已注入依赖项的对象的工厂函数。这集中了依赖项注入,并且可以更轻松地根据特定上下文配置依赖项。
func NewGuy() Guy { return &datstr{} } func someConsumer(g Guy) { fmt.Println("Hello, " + g.SomeDumbGuy()) } func main() { g := NewGuy() someConsumer(g) }
3.中间件
使用中间件函数拦截请求并将依赖项注入到请求上下文中。这提供了灵活性并允许动态依赖注入。
func wrapWithGuy(handler http.Handler) http.Handler { return func(w http.ResponseWriter, r *http.Request) { g := NewGuy() r.Context() = context.WithValue(r.Context(), "guy", g) handler.ServeHTTP(w, r) } } func main() { handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { g := r.Context().Value("guy").(Guy) fmt.Fprintf(w, "Hello, %s!", g.SomeDumbGuy()) }) http.Handle("/", wrapWithGuy(handler)) http.ListenAndServe(":8080", nil) }
避免 DI 库
与其他语言不同,Go 不需要使用依赖注入(DI ) 图书馆。事实上,DI 库可能会引入不必要的复杂性和抽象。 Go 的简单性和显式依赖管理提高了透明度和调试的简易性。
以上是如何超越基本实例化来改进依赖注入?的详细内容。更多信息请关注PHP中文网其他相关文章!