golang依賴注入工具digo

2023-06-02 12:00:41

golang依賴注入工具

digo工具地址:https://github.com/werbenhu/digo

特性

  • 使用註釋中的註解
  • 自動程式碼生成
  • 自動檢測迴圈依賴
  • 編譯時期依賴注入
  • 自動初始化
  • 支援範例組的管理

快速開始

更多範例請參考:examples

編寫程式碼和註解

package main

import (
	"log"

	"github.com/werbenhu/digo"
)

// @provider({"id":"main.db.url"})
func NewDbUrl() string {
	return "localhost:3306"
}

type Db struct {
	url string
}

// @provider({"id":"main.db"})
// @inject({"param":"url", "id":"main.db.url"})
func NewDb(url string) *Db {
	return &Db{
		url: url,
	}
}

type App struct {
	Db *Db
}

// @provider({"id":"main.app"})
// @inject({"param":"db", "id":"main.db"})
func NewApp(db *Db) *App {
	return &App{
		Db: db,
	}
}

func (a *App) Start() {
	log.Printf("app strat, db:%s\n", a.Db.url)
}

func main() {
	app, err := digo.Provide("main.app")
	if err == nil {
		app.(*App).Start()
	}
}

安裝digogen工具

go install github.com/werbenhu/digo/[email protected]

生成依賴注入程式碼

開啟命令列執行下面命令,digogen將會根據註解自動生成digo.generated.go原始碼檔案.

digogen

執行程式碼

go run .\digo.generated.go .\main.go

註解詳情

@provider

@provider註解表示是一個範例提供者,該範例是一個單例

  • 範例
// @provider({"id":"main.db"})
  • 支援的引數:
引數 型別 是否必需 說明
id string 範例的id

如果獲取範例,通過digo.Provide(providerId)可以獲取到某一個provider的範例

app, err := digo.Provide("main.app")
if err == nil {
	app.(*App).Start()
}

@inject

@inject註解表示注入一個範例到某個引數, @inject註解必須和@provider或者@group二者中的一個同時存在.

  • 範例
// @inject({"param":"db", "id":"main.db"})
  • 支援的引數:
引數 型別 是否必需 說明
param string 指明哪個引數需要注入範例
id string 指明需要注入的範例id
pkg string 該引數需要引入特定的包

pkg在什麼時候需要使用,比如我們需要引入一個包 github.com/xxx/tool/v1 , 我們使用包名的時候是這樣使用的 *tool.Struct, 而不是 *v1.Struct,那我們需要顯示指明需要匯入github.com/xxx/tool/v1

// @inject({"param":"tool", "id":"main.tool", "pkg":"github.com/xxx/tool/v1"})

@group

@group註解表示將範例註冊到一個組

  • 範例
// @group({"id":"main.controllers"})
  • 支援的引數:
引數 型別 是否必需 說明
id string 組的id

如果獲取組的所有範例,通過digo.Members(groupId)可以獲取到組的所有範例

ctrls, err := digo.Members("main.controllers")
if err == nil {
    for _, controller := range ctrls {
        // TODO:
    }
}