域和数据库之间的映射

时间:2018-06-17 11:42:21

标签: go

我正在创建从数据库获取数据的应用程序,并将它们作为JSON传递给前端。

我认为为我从数据库获取的数据和传递给REST服务的数据创建单独的structs是个好主意。我是对的还是我的错?

在这种情况下,我需要将结构从一个层映射到另一个层。我现在在数据库层中这样做:

func (ds *DataStore) AddUnit(_unit models.Unit) {

    unit := Unit{}
    unit.Name = _unit.Name
    unit.Description = _unit.Description
    db.Create(&unit)
}

func (ds *DataStore) UpdateUnit(id int, _unit models.Unit) models.Unit {

    unit := Unit{}
    db.First(&unit, id)
    unit.Name = _unit.Name
    unit.Description = _unit.Description
    db.Save(&unit)

    return _unit
}

现在我在代码中的每个实体的每个方法中都有这个代码。可能有一些方法或库来提取这个映射功能并在单独的文件中使用声明方式来描述它?

1 个答案:

答案 0 :(得分:0)

您可以寻找并使用图书馆; libs的问题在于他们正试图迎合未知问题。图书馆的作者不知道如何使用它。在某些情况下,这可以使它们更慢,更不灵活,更复杂,只需自己编写代码。

首先,您应该从DataStore

中提取重复的逻辑
// extract the logic of copying across the fields to a function
func setFields(u Unit, unit models.Unit) Unit {
    u.Name = unit.Name
    u.Description = unit.Description
    return u
}

func (ds *DataStore) AddUnit(_unit models.Unit) {
    // trimmed ...
    unit := setFields(Unit{}, _unit)
    // trimmed ...
}

func (ds *DataStore) UpdateUnit(id int, _unit models.Unit) models.Unit {
    unit := Unit{}
    db.First(&unit, id)

    unit = setFields(unit, _unit)

    // trimmed ...
}

您也可以考虑将setFields的函数调用提取到新接口:

type unitSetter interface {
   setFields(u Unit, unit models.Unit) Unit
}

并将其添加到DataStore以使代码更具可扩展性,可重用性和可测试性。

type DataStore struct {
    // trimmed ...
    units unitSetter
}

func (ds *DataStore) AddUnit(_unit models.Unit) {
    // trimmed ...
    unit := ds.units.setFields(Unit{}, _unit)
    // trimmed ...
}