Golang repostiory模式
我尝试在Go app(简单的Web服务)中实现存储库模式,并尝试找到更好的方法来转义代码重复.
这是一个代码 接口是: type IRoleRepository interface { GetAll() ([]Role,error) } type ISaleChannelRepository interface { GetAll() ([]SaleChannel,error) } 并实施: func (r *RoleRepository) GetAll() ([]Role,error) { var result []Role var err error var rows *sql.Rows if err != nil { return result,err } connection := r.provider.GetConnection() defer connection.Close() rows,err = connection.Query("SELECT Id,Name FROM Position") defer rows.Close() if err != nil { return result,err } for rows.Next() { entity := new(Role) err = sqlstruct.Scan(entity,rows) if err != nil { return result,err } result = append(result,*entity) } err = rows.Err() if err != nil { return result,err } return result,err } func (r *SaleChannelRepository) GetAll() ([]SaleChannel,error) { var result []SaleChannel var err error var rows *sql.Rows if err != nil { return result,err = connection.Query("SELECT DISTINCT SaleChannel 'Name' FROM Employee") defer rows.Close() if err != nil { return result,err } for rows.Next() { entity := new(SaleChannel) err = sqlstruct.Scan(entity,err } 正如您所看到的,差异只有几个字.我尝试从C#中找到类似Generics的东西,但没有找到. 谁能帮我? 解决方法
不,Go does not have generics并且在可预见的未来不会有它们.
你有三个选择: >重构您的代码,以便您拥有一个接受SQL语句和另一个函数的函数,并且: >使用提供的语句查询数据库. 在这种情况下,您将拥有一个通用的“查询”功能, 有几种变化是可能的,但我怀疑你有这个想法. 这样你就可以在另一个层面上获得可重用性:你根本就不会编写样板代码. 这样,你(通常)编写一个Go程序,它接受一些输入(以你想要的任何格式),读取它并写出一个或多个包含Go代码的文件,然后编译. 在您非常简单的情况下,您可以从Go函数的模板和某种表格开始,该表格将SQL语句映射到要从所选数据创建的类型. 我注意到你的代码确实看起来非常单调. 没有一个在他们正确的头脑中实现Go中的“存储库模式”,但这有点好,只要它让你开心 – 我们都在某种程度上被我们习惯的语言/环境灌输,但是你的联系: = r.provider.GetConnection()看起来很惊人:Go的数据库/ sql与“流行”的环境和框架截然不同,所以我强烈建议从this和this开始. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |