加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Golang repostiory模式

发布时间:2020-12-16 09:28:43 所属栏目:大数据 来源:网络整理
导读:我尝试在Go app(简单的Web服务)中实现存储库模式,并尝试找到更好的方法来转义代码重复. 这是一个代码 接口是: type IRoleRepository interface { GetAll() ([]Role,error)}type ISaleChannelRepository interface { GetAll() ([]SaleChannel,error)} 并实施
我尝试在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语句和另一个函数的函数,并且:

>使用提供的语句查询数据库.
>迭代结果的行.
>对于每一行,调用其任务所在的提供函数
扫描一行.

在这种情况下,您将拥有一个通用的“查询”功能,
差异仅在于“扫描”功能.

有几种变化是可能的,但我怀疑你有这个想法.
>使用sqlx软件包,它基本上是SQL驱动的数据库,对于JSON数据流是什么编码/ json:它使用类型的反射来创建和执行SQL来填充它们.

这样你就可以在另一个层面上获得可重用性:你根本就不会编写样板代码.
>使用code generation这是具有“代码模板”的Go-native方式(这是泛型的内容).

这样,你(通常)编写一个Go程序,它接受一些输入(以你想要的任何格式),读取它并写出一个或多个包含Go代码的文件,然后编译.

在您非常简单的情况下,您可以从Go函数的模板和某种表格开始,该表格将SQL语句映射到要从所选数据创建的类型.

我注意到你的代码确实看起来非常单调.

没有一个在他们正确的头脑中实现Go中的“存储库模式”,但这有点好,只要它让你开心 – 我们都在某种程度上被我们习惯的语言/环境灌输,但是你的联系: = r.provider.GetConnection()看起来很惊人:Go的数据库/ sql与“流行”的环境和框架截然不同,所以我强烈建议从this和this开始.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读