Interface and DB in golang
Perm Chao
Posted on March 6, 2022
As implement hexagonal pattern (Ports and adapters pattern), our code should separate to three sections
- API (Application Programming Interface) such your inbound (Gin, Echo, Fiber ...), Serialization or something else
- Domain, Entity or something else that make your app unique
- SPI (Service Programming Interface) such as external service, DB, DAO (Data Access Object) or something else
Example with below code, This will show relation with My Entity (Todo) and SPI(Database Insert)
- Entity -> Todo struct
- Port -> TodoHandler
- Adapters -> todoAdapter interface, MySQLDB and MongoDB struct
package main
import (
"log"
"go.mongodb.org/mongo-driver/mongo"
"gorm.io/gorm"
)
type Todo struct {
ID string
Title string
Description string
}
type todoAdapter interface {
Create(*Todo) error
}
type TodoHandler struct {
adapter todoAdapter
}
type MySQLDB struct {
db *gorm.DB
}
type MongoDB struct {
db *mongo.Collection
}
func NewTodoHandler(adapter todoAdapter) *TodoHandler {
return &TodoHandler{adapter: adapter}
}
func (db *MySQLDB) Create(todo *Todo) error {
log.Println("🐟 MySQL Create Interface")
// in real example, you can comment out below code
// err := db.db.Create(todo)
// return err
return nil
}
func NewMySQLDB(db *gorm.DB) *MySQLDB {
return &MySQLDB{db: db}
}
func (db *MongoDB) Create(todo *Todo) error {
log.Println("✅ MongoDB Create Interface")
// in real example, you can comment out below code
// _, err := db.db.InsertOne(context.TODO(), todo)
// return err
return nil
}
func NewMongoDB(db *mongo.Collection) *MongoDB {
return &MongoDB{db: db}
}
func main() {
var todoHandler *TodoHandler
// Todo insert with MySQL
mysqlAdapter := NewMySQLDB(&gorm.DB{})
todoHandler = NewTodoHandler(mysqlAdapter)
todoHandler.adapter.Create(&Todo{
ID: "1", Title: "New note", Description: "Save in mysql",
})
// Todo insert with MongoDB
mongoAdapter := NewMongoDB(&mongo.Collection{})
todoHandler = NewTodoHandler(mongoAdapter)
todoHandler.adapter.Create(&Todo{
ID: "1", Title: "New note", Description: "Save in mongo",
})
}
In the example, you will see two adapters should implement Create method to related with adapter interface
And result will be like this
2022/03/06 15:35:46 🐟 MySQL Create Interface
2022/03/06 15:35:46 ✅ MongoDB Create Interface
💖 💪 🙅 🚩
Perm Chao
Posted on March 6, 2022
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.
Related
githubcopilot AI Innovations at Microsoft Ignite 2024 What You Need to Know (Part 2)
November 29, 2024