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)