Implementing Hexagonal Architecture
ก่อนอื่นการจะเปลี่ยน Architecture แบบชุ้ย(ที่ทำใน Http handle บทความก่อน) ไปเป็น Hexagonal Architecture เราต้องสร้างหลายๆอย่างทำให้โค้ด base เปลี่ยนค่อนข้างเยอะแต่ก็จะขอให้ค่อยๆทำไปในความเร็วของตัวเองครับ
การจะทำ Hexagonal Architecture อย่างที่บอกไปใน introduction เราจำเป็นต้องมี Port ที่เป็น interface ก่อนซึ่ง interface ในที่นี้คือการกำหนดชื่อของ function รวมถึง parameter และ return statement ด้วย งั้นก่อนอื่นเรามาสร้าง folder เพื่อให้เข้าใจง่ายว่าส่วนไหนคือส่วนไหนของ Hexagonal Architecture กันดีกว่า ซึ่งในที่นี้เราจำเป็นต้องสร้าง 3 folder นั้นคือ repository, service, และ handler
เราจะเริ่มสร้างจากชั้นที่ลึกที่สุดที่เก็บข้อมูลไปถึงชั้นที่เอาข้อมูลที่ประมวณผลแล้วไปแสดงให้ user สามารถเรียกได้ หรือก็คือเราจะสร้าง repository -> service -> handler นั้นเอง
Repository
1. สร้างไฟล์ชื่อว่า user.go
ขึ้นมาใน folder repository และโค้ดด้านในเราจะเก็บ struct (model ของข้อมูล) และ interface นั้นเอง
package repository
type User struct {
Id int64 `json:"id"`
Email string `json:"email"`
Password string `json:"password"`
Secret string `json:"secret"`
}
type UserRepository interface {
CreateUser(email string, password string, secret string) (*User, error)
CheckUser(email string) (*User, error)
GetUsers() ([]*User, error)
}
ซึ่ง model พวกนี้สามารถเปลี่ยนแปลงได้ตามที่ออกแบบไว้ได้เลย แต่ส่วนมากจะนำข้อมูลที่มีอยู่ใน database มาเป็น struct นั้นเอง ส่วน interface ก็สามารถเปแลี่ยนไปตามที่เรา design ได้เช่นกันแต่ในที่นี้ขอเป็นเท่านี้ก่อนเพื่อให้เข้าใจ