Wire is a code generation tool that automates connecting components using dependency injection
ลองใช้ Wire กับ Project API Todo แบบง่ายๆ
เครื่องมือที่ใช้
- golang
- go fiber
- postgres
ขั้นตอน
- เริ่มจากสร้างโปรเจคขึ้นมา 1 โปรเจคโดยมีไฟล์ในโฟรเดอร์ดังนี้
- go.mod
- cmd
- webservice
- main.go
- wire.go
- controllers
- todo_controller.go
- services
- config
- env.go
- db
- gorm.go
- server
- fiber.go
- โฟกัสที่ 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() { // ยังไม่ต้องสนใจตรงนี้ }
- ไปที่ file
cmd/webservice/wire.go
จะเห็นว่าที่wire.Build(...)
ใน ... จะต้องมี function ที่ return struct ที่เราสนใจจะใช้งานใน structWebservice
// vvvvvvvv ต้องใส่นะ vvvvvvvv //go:build wireinject // +build wireinject func InitWebservice() *Webservice { wire.Build(NewWebService, config.NewENVConfig, db.NewDB, controllers.NewTodoController) return &Webservice{} }
- กลับมาที่ file
cmd/webservice/main.go
แล้ว run คำสั่งใน terminal run คำสั่งwire
แล้วมันจะสร้าง file มาให้อันนึงชื่อwire_gen.go
ซึ่งในนั้นจะมี functionInitWebservice
มาให้ในแบบที่ inject ตัว dependencies ทั้งหมดที่จำเป็นมาให้แล้ว
func main() { webservice := InitWebservice() }
- ซึ่งถ้าต้องการเพิ่ม dependencies ต้องเพิ่ม 2 ที่
- function New....(..., dependency ที่เราอยากเพิ่ม *DependencyStruct)
- wire.Build(...., NewDependencyFn ที่ return dependency นั้นๆ) แล้ว wire จะไปหา dependency เหล่านั้นมาใส่ให้เราเอง ความ
ความรู้สึกหลังใช้
รู้สึกว่าไม่ค่อยจำเป็นต้องใช้มันเท่าไหร่ 555
Top comments (0)