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

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay