【发布时间】:2021-04-10 21:51:37
【问题描述】:
我们知道服务(控制器/用例)层是处理业务逻辑, repo 是用来处理 db 查询的
现在我有:
func (s *OrderService) Create(order models.Order) (models.Order, error) {
...
user := models.User{
Contact: order.Address.Contact,
}
createdUser, err := s.UserRepo.Save(user)
// err handling...
order.User = user
createdOrder, err := s.OrderRepo.save(order)
// err handling...
return order, nil
}
// user_repo.go
func (repo *UserRepo) Save(user models.User) (models.User, error) {
err := repo.DB.Debug().Save(&user).Error
// err handing...
return user, nil
}
// order_repo.go
func (repo *OrderRepo) Save(order models.Order) (models.Order, error) {
err := repo.DB.Debug().Save(&order).Error
// err handing...
return order, nil
}
我希望应用 gorm db.Begin() 事务变得更加灵活,而不是我当前的代码过于静态。
所以我应该删除gorm.DB repo 但是
我。通过params传入gorm.DB??
tx := s.DB.Begin()
createdUser, err := s.UserRepo.Save(user, tx)
二。还是直接在服务层运行查询?? (但它打破了 ddd 的设计理念)
tx := s.DB.Begin()
createdUser, err := tx.Create(&user)
if err != nil {
tx.Rollback()
}
createdOrder, err := tx.Create(&order)
if err != nil {
tx.Rollback()
}
tx.Commit()
【问题讨论】:
标签: database go transactions domain-driven-design go-gorm