Golang 依赖注入框架,帮助开发者构建 Go 应用
大家好,又见面了,我是 GitHub 精选君!
今天要给大家推荐一个 GitHub 开源项目 alibaba/IOC-golang,该项目在 GitHub 有超过 1k Star,用一句话介绍该项目就是:“一款服务于 Go 开发者的依赖注入框架,方便搭建任何 Go 应用。 A Golang depenedency injection framework, helps developers to build any go application.”。
IOC-golang 是一个由阿里巴巴开源的 Go 语言实现的 Inversion of Control (IoC) 容器。该项目提供了一种简单的方法来管理依赖关系,使得应用程序的组件之间能够更加松耦合。它主要支持构造函数注入和 setter 注入两种方式,支持单例和多实例,支持依赖循环解决。通过使用 IOC-golang,可以使代码更加结构化,提高代码的可维护性和可测试性。
以下是该项目 Star 趋势图(代表项目的活跃程度):
如何安装使用
IOC-golang 是阿里巴巴开源的一个基于反射机制的 Golang 控制反转 (IOC) 容器,它支持构造函数注入和属性注入。
安装方式:
- 使用 go get 命令安装:
go get -u github.com/alibaba/IOC-golang
- 使用 go mod 安装:
require github.com/alibaba/IOC-golang v1.2.0
- 使用 dep 安装:
dep ensure -add github.com/alibaba/IOC-golang
安装完成后,就可以在代码中通过 import 引入并使用该项目了。
使用示例 DEMO
以下是一个简单的 demo 代码,用于展示如何使用 IOC-golang 来管理依赖关系:
对应代码如下:
package main
import (
"fmt"
"time"
"github.com/alibaba/ioc-golang"
)
// +ioc:autowire=true
// +ioc:autowire:type=singleton
type App struct {
// inject main.ServiceImpl1 pointer to Service interface with proxy wrapper
ServiceImpl1 Service `singleton:"main.ServiceImpl1"`
// inject main.ServiceImpl2 pointer to Service interface with proxy wrapper
ServiceImpl2 Service `singleton:"main.ServiceImpl2"`
// inject ServiceImpl1 pointer to Service1 's own interface with proxy wrapper
// this interface belongs to ServiceImpl1, there is no need to mark 'main.ServiceImpl1' in tag
Service1OwnInterface ServiceImpl1IOCInterface `singleton:""`
// inject ServiceStruct struct pointer
ServiceStruct *ServiceStruct `singleton:""`
}
func (a *App) Run() {
for {
time.Sleep(time.Second * 3)
fmt.Println(a.ServiceImpl1.GetHelloString("laurence"))
fmt.Println(a.ServiceImpl2.GetHelloString("laurence"))
fmt.Println(a.Service1OwnInterface.GetHelloString("laurence"))
fmt.Println(a.ServiceStruct.GetString("laurence"))
}
}
type Service interface {
GetHelloString(string) string
}
// +ioc:autowire=true
// +ioc:autowire:type=singleton
type ServiceImpl1 struct {
}
func (s *ServiceImpl1) GetHelloString(name string) string {
return fmt.Sprintf("This is ServiceImpl1, hello %s", name)
}
// +ioc:autowire=true
// +ioc:autowire:type=singleton
type ServiceImpl2 struct {
}
func (s *ServiceImpl2) GetHelloString(name string) string {
return fmt.Sprintf("This is ServiceImpl2, hello %s", name)
}
// +ioc:autowire=true
// +ioc:autowire:type=singleton
type ServiceStruct struct {
}
func (s *ServiceStruct) GetString(name string) string {
return fmt.Sprintf("This is ServiceStruct, hello %s", name)
}
func main() {
// start to load all structs
if err := ioc.Load(); err != nil {
panic(err)
}
// Get Struct
app, err := GetAppSingleton()
if err != nil {
panic(err)
}
app.Run()
}
通过如下方式运行代码:
% go mod init ioc-golang-demo
% export GOPROXY="https://goproxy.cn"
% go mod tidy
% go get github.com/alibaba/ioc-golang@master
% sudo iocli gen
会在当前目录生成:zz_generated.ioc.go,开发者无需关心这一文件,这一文件中就包含了上面使用的 GetAppSingleton 方法。执行程序后控制台打印输出如下,可看到,依赖注入成功,程序正常运行。
更多项目详情请查看如下链接。
开源项目地址:https://github.com/alibaba/IOC-golang
开源项目作者:alibaba
以下是参与项目建设的所有成员:
关注我们,一起探索有意思的开源项目。
更多精彩请扫码关注如下公众号。