golang 依赖注入 dig详解

golang的依赖注入dig

  • 一篇文章带你了解golang依赖注入

dig介绍:

dig 库是一个为 go 提供依赖注入 (dependency injection) 的工具包,基于 reflection 实现的。

在项目中会涉及到很多对象,它们之间的依赖关系可能是这样的

对象 D 的创建依赖于对象 B 和 对象 C

对象 B 和对象 C 的创建依赖于对象 A

func NewD(b *B,c *C) *D{
   }
func NewB(a *A)*B{
   }
func NewC(a *A)*C{
   }
func NewA() *A{
   }

如果在很多地方都需要用户 D 对象,有两个方法

  1. 从别的地方传一个 D 对象过来
  2. 利用 NewD 重新生成一个新的 D 对象

在 Package 之间进行传递对象,可能会造成 Package 间的耦合,因此一般情况下我们会采取第二种方法。

但现在问题来了,D 对象的生成依赖于 B 对象和 C 对象,要想得到 B 对象和 C 对象,就需要调用 NewB 和 NewC 去生成,而 NewB 和 NewC 需要以 A 为参数,这就需要调用 NewA 来生成 A。项目中不可避免地会出现大量的 NewXXx() 这种方法的调用。dig 库由此而生,按照官方的说法,它就是用来管理这种 对象图 的。


dig基本使用方法:

使用方法总结起来就三步:

  1. 使用 dig.New() 创建 digObj
  2. 调用 digObj.Provide() 提供依赖
  3. 调用 digObj.Invoke() 生成目标
type A struct{
   }
type B struct{
   }
type C struct{
   }
type D struct{
   }

func NewD(b *B, c *C) *D {
   
	fmt.Println("NewD()")
	return new(D)
}
func NewB(a *A) *B {
   
	fmt.Println("NewB()")
	return new(B)
}
func NewC(a *A) *C {
   
	fmt.Println("NewC()")
	return new(C)
}
func NewA() *A {
   
	fmt.Println("NewA()")
	return new(A)
}

func main() {
   
	// 创建 dig 对象
	digObj := dig.New()
	// 利用 Provide 注入依赖
	digObj.Provide(NewA)
	digObj.Provide(NewC)
	digObj.Provide(NewB)
	digObj.Provide(NewD)
	var d *D
	assignD := func(argD *D) {
   
		fmt.Println("assignD()")
		d = argD
	}
	fmt.Println("before invoke")
	// 根据提前注入的依赖来生成对象
	if err := digObj.Invoke(assignD); err != nil {
   
		

你可能感兴趣的:(golang,golang,开发语言,后端)