DEV Community

Perm Chao
Perm Chao

Posted on • Edited on

ลองใช้ Google Wire เพื่อทำ Dependency Injection ใน Go

Wire is a code generation tool that automates connecting components using dependency injection

ลองใช้ Wire กับ Project API Todo แบบง่ายๆ

เครื่องมือที่ใช้

  • golang
  • go fiber
  • postgres

ขั้นตอน

  1. เริ่มจากสร้างโปรเจคขึ้นมา 1 โปรเจคโดยมีไฟล์ในโฟรเดอร์ดังนี้
  • go.mod
  • cmd
    • webservice
    • main.go
    • wire.go
  • controllers
    • todo_controller.go
  • services
    • config
    • env.go
    • db
    • gorm.go
    • server
    • fiber.go
  1. โฟกัสที่ file cmd/webservice/main.go สร้าง struct ขึ้นมาหนึ่งตัวและ function ที่ทำหน้าที่สร้าง struct ตัวนั้นเสมือนเป็น constructor
// vvvvvvvv สนใจ struct ตัวนี้ vvvvvvvv
type WebService struct {
 ENVConfig *config.ENVConfig
 DB        *gorm.DB
 TodoController *controllers.TodoController
}

// vvvvvvvv สนใจ function ตัวนี้ vvvvvvvv
func NewWebService(envConfig *config.ENVConfig, db *gorm.DB, todoController *controllers.TodoController) *WebService {
 return &WebService{
  DB: db,
  ENVConfig: envConfig,
  TodoController: todoController,
 }
}

func main() {
 // ยังไม่ต้องสนใจตรงนี้
}
Enter fullscreen mode Exit fullscreen mode
  1. ไปที่ file cmd/webservice/wire.go จะเห็นว่าที่ wire.Build(...) ใน ... จะต้องมี function ที่ return struct ที่เราสนใจจะใช้งานใน struct Webservice
// vvvvvvvv ต้องใส่นะ vvvvvvvv
//go:build wireinject
// +build wireinject

func InitWebservice() *Webservice {
    wire.Build(NewWebService, config.NewENVConfig, db.NewDB, controllers.NewTodoController)
    return &Webservice{}
}
Enter fullscreen mode Exit fullscreen mode
  1. กลับมาที่ file cmd/webservice/main.go แล้ว run คำสั่งใน terminal run คำสั่ง wire แล้วมันจะสร้าง file มาให้อันนึงชื่อ wire_gen.go ซึ่งในนั้นจะมี function InitWebservice มาให้ในแบบที่ inject ตัว dependencies ทั้งหมดที่จำเป็นมาให้แล้ว
func main() {
 webservice := InitWebservice()
}
Enter fullscreen mode Exit fullscreen mode
  1. ซึ่งถ้าต้องการเพิ่ม dependencies ต้องเพิ่ม 2 ที่
  2. function New....(..., dependency ที่เราอยากเพิ่ม *DependencyStruct)
  3. wire.Build(...., NewDependencyFn ที่ return dependency นั้นๆ) แล้ว wire จะไปหา dependency เหล่านั้นมาใส่ให้เราเอง ความ

ความรู้สึกหลังใช้

รู้สึกว่าไม่ค่อยจำเป็นต้องใช้มันเท่าไหร่ 555

Top comments (0)