代码之家  ›  专栏  ›  技术社区  ›  ceth

域和数据库之间的映射

go
  •  0
  • ceth  · 技术社区  · 7 年前

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

    我认为创建独立的 structs 从数据库中获取的数据和传递给rest服务的数据。我是对的还是错了?

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

    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 回复  |  直到 7 年前
        1
  •  0
  •   Zak    7 年前

    您可以查找并使用库;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
    }
    

    并将此添加到 小精灵 使代码更具扩展性、可重用性和可测试性。

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