Files
eagle/internal/repository/README.md
2021-12-19 22:58:29 +08:00

40 lines
2.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Repository
Repository是数据访问层负责访问 DB、MC、外部 HTTP 等接口,对上层屏蔽数据访问细节。
后续更换、升级ORM引擎不影响业务逻辑。能提高测试效率单元测试时用Mock对象代替实际的数据库存取可以成倍地提高测试用例运行速度。
应用 Repository 模式所带来的好处,远高于实现这个模式所增加的代码。只要项目分层,都应当使用这个模式。
Repository是DDD中的概念强调 Repository 是受Domain(本项目主要是Service)驱动的。
对 Model 层只能单表操作,每一个方法都有一个参数 `db *grom.DB` 实例,方便事务操作。
具体职责有:
- SQL 拼接和 DB 访问逻辑
- DB 的拆库分表逻辑
- DB 的缓存读写逻辑
- HTTP 接口调用逻辑
> Tips: 如果是返回的列表尽量返回map方便service使用。
建议:
- 推荐使用编写原生SQL
- 禁止使用连表查询,好处是易扩展,比如分库分表
- 逻辑部分在程序中进行处理
一个业务一个目录每一个repo go文件对应一个表操作比如用户是在user目录下涉及用户相关的都可以放到这里
根据不同的模块分离到不同的文件同时又避免了单个文件func太多的问题。比如
- 用户基础服务- user_base_repo.go
- 用户关注- user_follow_repo.go
- 用户喜欢- user_like_repo.go
- 用户评论- user_comment_repo.go
## 单元测试
关于数据库的单元测试可以用到的几个库:
- go-sqlmock https://github.com/DATA-DOG/go-sqlmock 主要用来和数据库的交互操作:增删改
- GoMock https://github.com/golang/mock
## Reference
- https://github.com/realsangil/apimonitor/blob/fe1e9ef75dfbf021822d57ee242089167582934a/pkg/rsdb/repository.go
- https://youtu.be/twcDf_Y2gXY?t=636
- [Unit testing GORM with go-sqlmock in Go](https://medium.com/@rosaniline/unit-testing-gorm-with-go-sqlmock-in-go-93cbce1f6b5b)
- [如何使用Sqlmock对GORM应用进行单元测试](https://1024casts.com/topics/R9re7QDaq8MnJoaXRZxdljbNA5BwoK)