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()
}
}
go install github.com/werbenhu/digo/[email protected]
開啟命令列執行下面命令,digogen
將會根據註解自動生成digo.generated.go
原始碼檔案.
digogen
go run .\digo.generated.go .\main.go
@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註解必須和@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({"id":"main.controllers"})
引數 | 型別 | 是否必需 | 說明 |
---|---|---|---|
id | string | 是 | 組的id |
如果獲取組的所有範例,通過digo.Members(groupId)
可以獲取到組的所有範例
ctrls, err := digo.Members("main.controllers")
if err == nil {
for _, controller := range ctrls {
// TODO:
}
}