go - Go 结构分离最佳实践
问题描述
我试图找出一种体面的方法来处理结构的多种用途。让我解释一下这个场景。
我有一个代表gorm中的模型的结构。在当前实现中,我将验证绑定到此结构,因此当请求到达端点时,我将针对模型的结构进行验证。这适用于大多数情况。但是在某些情况下,我希望对请求和响应有更多的控制权。
这可以通过引入一些额外的内部结构来解析请求和响应。我可以将验证从模型解耦到请求特定的结构中。我试图弄清楚围绕这些模式的最佳实践是什么。可以肯定,很多偷窥者都会面临类似的情况。
// Transaction holds the transaction details.
type Transaction struct {
Program Program
ProgramID uuid.UUID
Type string
Value float64
Reference string
}
// TransactionRequest for the endpoint.
type TransactionRequest struct {
ProgramKey string `json:"program_key" validator:"required"`
Type string `json:"type" validator:"required,oneof=credit debit"`
Value float64 `json:"value" validator:"required,numeric"`
Reference string `json:"reference" validator:"required"`
}
更新:
我设法通过为更新请求引入额外的标签来找到平衡,我在这里写了我是如何实现它的
解决方案
我遇到了类似的问题,为了解决这个问题,定义了一种验证方法并且不使用标签。我必须这样做,因为我遵循 DDD,我们应该在服务层而不是 API 层进行验证。
这是我的方法示例:
type Station struct {
types.GormCol
CompanyID types.RowID `gorm:"not null;unique" json:"company_id,omitempty"`
CompanyName string `gorm:"not null;unique" json:"company_name,omitempty"`
NodeCode uint64 `json:"node_code,omitempty"`
NodeName string `json:"node_name,omitempty"`
Key string `gorm:"type:text" json:"key,omitempty"`
MachineID string `json:"machine_id,omitempty"`
Detail string `json:"detail,omitempty"`
Error error `sql:"-" json:"user_error,omitempty"`
Extra map[string]interface{} `sql:"-" json:"extra_station,omitempty"`
}
// Validate check the type of
func (p *Station) Validate(act action.Action) error {
fieldError := core.NewFieldError(term.Error_in_companys_form)
switch act {
case action.Save:
if p.CompanyName == "" {
fieldError.Add(term.V_is_required, "Company Name", "company_name")
}
if p.CompanyID == 0 {
fieldError.Add(term.V_is_required, "Company ID", "company_id")
}
}
if fieldError.HasError() {
return fieldError
}
return nil
}
文件地址:https ://github.com/syronz/sigma-mono/blob/master/model/station.model.go
推荐阅读
- c++ - CMake:“导入的目标
包括不存在的路径” - reactjs - Office Fluent UI / DatePicker - onSelectDate 不发送事件作为参数
- javascript - 从数据中删除叶节点
- javascript - 添加chart.js后,我的锚标签在我的网站中不起作用
- android - 云数据库 AGConnectInitializeProvider 错误
- node.js - Facebook API,创建创意错误无法加载帖子
- c# - 在 C# 中查找给定的 2 个字符串数组中的位置和差异项
- c++ - 如果功能已经启动,我该如何停止?
- java - 如何解决,非法尝试将非集合映射为 @OneToMany、@ManyToMany 或 @CollectionOfElements
- amazon-web-services - Is there a way to conditionally add expiration policies to an S3 bucket in cloudformation