Go语言结构体分离最佳实践。

6

我正在尝试找出一种处理多重用途结构体的合理方法。让我解释一下情况。

我有一个代表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"`
}

更新:

我通过引入额外的标签来处理更新请求,成功找到了平衡点。有关如何实现的详细信息,请查看这里


2
你能提供一个结构体的例子吗? - Grigoriy Mikhalkin
也许你可以分享一些虚拟代码。这将澄清需求。 - Nikhil
1个回答

1
我遇到了类似的问题,为了解决这个问题,我定义了一种验证方法,并且没有使用标签。我不得不这样做,因为我遵循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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接