golang wire依赖注入

安装

go get github.com/google/wire/cmd/wire@latest

一.假设需要定义多个有依赖的启动项,新建main.go

package main
import ("fmt")

type Message string

func NewMessage() Message {
    return Message("Hi there!")
}

type Event struct {
    Greeter Greeter 
}

func NewEvent(g Greeter) Event {
    return Event{Greeter: g}
}

func (e Event) Start() {
    msg := e.Greeter.Greet()
    fmt.Println(msg)
}

func NewGreeter(m Message) Greeter {
    return Greeter{Message: m}
}

type Greeter struct {
    Message Message 
}

func (g Greeter) Greet() Message {
    return g.Message
}

func main() {
    // message := NewMessage()
    // greeter := NewGreeter(message)
    // event := NewEvent(greeter)
    // event.Start()
    //如果没依赖注入,就需要写上面这些代码,现在用一个 InitializeEvent 方法包含这些,而这个方法让他自动生成
    e := InitializeEvent()
    e.Start()
}

二。新建一个 wire.go 文件,名称不一定用这个,但是为了规范和约束,一般都用这个。内容如下。 +build wireinject是简写,不能少

//go:build wireinject
// +build wireinject

package main

import "github.com/google/wire"

func InitializeEvent() Event {
    wire.Build(NewEvent, NewGreeter, NewMessage)
    return Event{}
}
//这个是简写,直接用 panic 包裹起来即可,因为不需要检查,所以不需要反馈
// func InitializeEvent() Event {
//  panic(wire.Build(NewEvent, NewMessage, NewGreeter))
// }

三。执行 wire 命令,wire gen wire.go,自动生成 wire_gen.go 文件,内容如下:

// Code generated by Wire. DO NOT EDIT.

//go:generate go run github.com/google/wire/cmd/wire
//go:build !wireinject
// +build !wireinject

package main

// Injectors from wire.go:

func InitializeEvent() Event {
    message := NewMessage()
    greeter := NewGreeter(message)
    event := NewEvent(greeter)
    return event
}
posted @ 2024-03-01 09:33  朝阳1  阅读(54)  评论(0)    收藏  举报