首页 >后端开发 >Golang >如何超越基本实例化来改进依赖注入?

如何超越基本实例化来改进依赖注入?

Barbara Streisand
Barbara Streisand原创
2024-12-21 09:48:13202浏览

How Can I Improve Dependency Injection in Go Beyond Basic Instantiation?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn