golang 里的 di 应用第三方库(如 wire、injector)完成,关键差异在于:词法:使用函数,并非注释或 xml 配备进行配置。种类安全性:依赖项种类在编译时查验。编译时引入:在编译时开展引入,提高性能。
Golang 框架中的依赖注入与其它编程语言的对比依赖注入 (DI) 是一种设计模式,它允许应用软件部件在不立即建立他们的情形下获得他们所需的依赖项。在 Golang 中,DI 一般根据使用第三方库来达到,比如 Wire 或 injector。
Golang 框架中的 DIGolang 里的DI 架构一般遵循下列方式:
定义接口,代表应用程序中的部件。建立一个函数或方法,该函数或方法将插口作为输入,并返回该接口具体完成。应用DI 架构将函数或方法注入到必须它部件中。比如,应用 Wire 架构,可以用 wire.Build()函数来引入依赖项:
import"github.com/google/wire"
//定义接口
typeServiceinterface{
DoSomething()
}
//界定完成
typeServiceImplstruct{}
func(sServiceImpl)DoSomething(){}
//应用 Wire 引入依赖项
funcProvideService()Service{
wire.Build(ServiceImpl)
returnnil
}
与其它编程语言的对比与其它编程语言里的DI 对比,Golang 里的DI 有以下一些重要差别:
词法: Golang 里的DI 架构一般使用函数而非注释或 XML 配备进行配置。这使得DI 更容易理解与使用。种类安全性: Golang 是一种静态类型语言,这意味着在编译时可以检查依赖项种类。这有助于防止依赖项引入错误。编译时引入: Golang 里的DI 出现于编译时,而非运行中。这提升了特性并降低了反射的应用。实战案例 考虑一个必须访问数据库的应用程序:
定义一个插口,代表数据库访问服务:1
typeDatabaseServiceinterface{
GetCustomer(idint)(Customer,error)
}
创建一个服务完成,该完成应用 SQL 驱动软件访问数据库:1
typeSQliteDatabaseServicestruct{}
func(sSQliteDatabaseService)GetCustomer(idint)(Customer,error){
//从 SQLite 数据库精准获客
}
应用 Wire 引入数据库服务到控制器中:1
packagecontrollers
import(
"github.com/google/wire"
"github.com/myproject/database"
)
//控制器的结构体
typeCustomerControllerstruct{
dbdatabase.DatabaseService
}
//应用 Wire 引入依赖项
varCustomerControllerSet= wire.NewSet(
database.ProvideDatabaseService,
wire.Struct(new(CustomerController),""),
)
以上就是golang框架中的依赖注入与其它编程语言里的较为的详细内容,大量请关注其他类似文章!