欢迎您光临机械网,如有问题请及时联系我们。

为什么有很多人说Go语言不需要依赖注入?

作者:机械网
文章来源:本站

  

依赖注入

 

  依赖注入(Dependency Injection)是一种鼓励模块化的软件工程范式,是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。而通过模块与模块的依赖做解耦,有利于:

  

为什么有很多人说Go语言不需要依赖注入?

  上述就是依赖注入的目的,它其实是独立于依赖注入的实现。

  更加具体的说,是否使用反射,是否支持在运行时通过修改配置来替换依赖的等等,是属于具体依赖注入实现的特性;它们其实无关于依赖注入范式的考量。

  使用依赖注入是为了让程序可以更好模块化管理,将模块与依赖解耦,以便于测试,构造高度复杂的程序;而不是为了在运行时通过修改配置来替换依赖实现。

  换句话说,如果我们开发的程序足够简单,那么是没有必要去使用依赖注入范式的;但如果我们开发的是一款高度复杂、需要多团队配合的程序,类似依赖注入这样的范式,则显得必不可少。

  

为什么有很多人说Go语言不需要依赖注入?

  那么go语言是否需要依赖注入?

  显然需要,比方说,谷歌开源的go-cloud,这个支持跨云服务商的SDK,便是例子;其团队为了使用依赖注入范式,也顺带开源了wire:一个基于编译时、代码生成实现的依赖注入框架。

  Go对独特的语言特性其实不是内置支持goroutine(协程在很多语言其实都有内置或者类库层面的支持),而是其interface接口,在go语言里面,接口的定义可以迟于实现。

  

为什么有很多人说Go语言不需要依赖注入?

  开发go程序的时候,我们可以直接编写struct的实现,而无需关心,甚至无法关心具体struct实现了哪些接口。什么样的函数签名组合才构成一个接口,在go语言里面可以是取决于类库、模块的使用者,而不是实现者。

  Go语言的接口可以迟于struct实现来定义这一独一无二的语言特性,使得我们在使用依赖注入的时可以先方便的注入具体类型;而在后续需要扩展为“接口”,提供多个实现的时候,无需修改模块代码。

  可以说,go语言与依赖注入范式是相当绝妙的搭配。

  Go语言的interface的特性使得在很多情况下,依赖注入变得没有如Java等语言中重要。然而,依赖注入在一些复杂的场景中也有用武之地,go与依赖注入仍有很大的研究空间。

  先介绍什么是依赖注入(DI)?

  这里牵涉到一词控制反转(ioc):是面向对象编程中的一种设计原则,可以用来降低计算机代码之间的耦合度。为什么用控制反转呢?因为大多数应用程序都是有两个或是更多类合作来实现企业逻辑的,,这使得每个对象都需要获取与其合作的对象(也就是它所依赖的对象)的引用。如果这个获取过程要靠自身实现,那么这将导致代码高度耦合并且难以维护和调试。

  所谓依赖注入,就利于语言反射机制动态地将某种依赖关系注入到对象(可理解为一种ioc容器)之中。所有被注入的对象和依赖对象统一有ioc容器管理。被注入对象需要什么,可以从ioc容器取,后者会把相应的被依赖对象注入到被注入对象中,从而达到ioc容器为被注入对象服务的目的。从被注入对象的角度看,与之前直接需求依赖对象相比,依赖对象取得方式发生了反转,控制也从被注入对象转移到了ioc容器。

  简单来说,依赖注入是控制反转的具体实现方式之一。

  依赖注入作为比较复杂的一种解耦方案,并不特指某个语言。如果你系统简单,完全可以不用

  golang也有依赖注入,感兴趣可以了解一下。

  1.<https://github.com/facebookarchive/inject>

  大厂facebook出品,比较简单,不过好久没有更新了。

  2.<https://github.com/google/wire>

  google官方出品,牛逼的是没用使用反射,是一个在编译期实现依赖注入的框架。

来源:文章来源于网络,如有侵权请联系我们及时删除。本文由机械网转载编辑,欢迎分享本文!