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)