chenyahui / chenyahui.github.io

My blog
http://www.cyhone.com
0 stars 2 forks source link

Facebook 在 Golang 依赖注入的实现 | 编程沉思录 #53

Open chenyahui opened 3 years ago

chenyahui commented 3 years ago

https://www.cyhone.com/articles/facebookgo-inject/

依赖注入是一个经典的设计模式,在解决复杂的对象依赖关系方面是一个非常行之有效的手段。 对于有反射功能的语言来说,实现依赖注入都比较方便一些。在 Golang 中有几个比较知名的依赖注入开源库,例如 google/wire、uber-go/dig 以及 facebookgo/inject 等。 本文将基于 facebookgo/inject 介绍依赖注入, 接下来将会着重讨论以下几点内容: 依赖注

ahlixinjie commented 3 years ago

网上博客看到写的最通透的就是这篇了~

WinniCoder commented 3 years ago

写得好清楚,看完就懂了

chenyahui commented 3 years ago

@WinniCoder 写得好清楚,看完就懂了

要不要这么官方

zhiyi10 commented 3 years ago

winni喊我们组来学习这篇

huyang741852 commented 3 years ago

@zhiyi10 winni喊我们组来学习这篇 +1

byene0923 commented 2 years ago

这个库是有bug的。如果存在环,且环全部是private类型,就会陷入死循环

type A struct {
    B *B
    C *C `inject:"private"`
}

type B struct {
    age int
}

type C struct {
    D *D `inject:"private"`
}

type D struct {
    //name string
    A *A `inject:"private"`
}

func TestAAAA(t *testing.T) {
    b := &B{
        age: 6,
    }
    a := &A{}
    vars := make([]interface{}, 0)
    vars = append(vars, a)
    vars = append(vars, b)
    inject.Populate(vars...)
}
Ssummer520 commented 2 years ago

我想问一下 是不是说按照这种依赖注入的话 当前的泛型也可以依赖注入

chenyahui commented 2 years ago

@byene0923 这个库是有bug的。如果存在环,且环全部是private类型,就会陷入死循环

type A struct {
  B *B
  C *C `inject:"private"`
}

type B struct {
  age int
}

type C struct {
  D *D `inject:"private"`
}

type D struct {
  //name string
  A *A `inject:"private"`
}

func TestAAAA(t *testing.T) {
  b := &B{
      age: 6,
  }
  a := &A{}
  vars := make([]interface{}, 0)
  vars = append(vars, a)
  vars = append(vars, b)
  inject.Populate(vars...)
}

的确是有循环问题。不过这种依赖自行设置struct field的注入方式,似乎也没有很好的解决方案

chenyahui commented 2 years ago

@Ssummer520 我想问一下 是不是说按照这种依赖注入的话 当前的泛型也可以依赖注入

还没试过在泛型下使用,我这边尝试下后再给出结论