精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Go 工程化之如何優(yōu)雅的寫出 Repo 層代碼

開發(fā) 前端
我們?cè)讷@取文章的時(shí)候大部分時(shí)候可能都是通過(guò) id 獲取的,但是我們也可能通過(guò)標(biāo)題等其它信息獲取文章的數(shù)據(jù),這時(shí)候我們的 repo 層代碼怎么寫呢?

[[442185]]

上篇文章中我們提到了事務(wù)的幾種解決方案,可以避免在 repo 中寫很多不同事務(wù)的方法,這篇我們看一下怎么讓 repo 層的代碼看起來(lái)優(yōu)雅一點(diǎn)

還是以獲取一篇文章為例,我們?cè)讷@取文章的時(shí)候大部分時(shí)候可能都是通過(guò) id 獲取的,但是我們也可能通過(guò)標(biāo)題等其它信息獲取文章的數(shù)據(jù),這時(shí)候我們的 repo 層代碼怎么寫呢?

最簡(jiǎn)單的方式,就是我們直接在 repo 這里寫兩個(gè)方法

  1. // IArticleRepo IArticleRepo 
  2. type IArticleRepo interface { 
  3.  GetArticleByTitle(ctx context.Context, title string) (*Article, error) 
  4.  GetArticleByID(ctx context.Context, id int) (*Article, error) 

這樣最簡(jiǎn)單也最直觀,但是問(wèn)題是我們的實(shí)際的業(yè)務(wù)需求往往比我們的例子復(fù)雜,如果我們需要通過(guò) id 或者標(biāo)題獲取呢?再添加一個(gè) GetArticleByIDOrTitle ?

這么做的話也不是不行,但是這么做的話就會(huì)讓我們的 repo 的代碼隨著時(shí)間的增長(zhǎng)越來(lái)越多不說(shuō),命名也是問(wèn)題,因?yàn)榻M合的方式可能是多種多樣的

接下來(lái)給大家提供一種我們正在使用的一種思路,利用 Function Options 這種 Go 常見的編程范式,使我們的 repo 更優(yōu)雅,也可擴(kuò)展

DBOption

注意: 筆者這里使用的是 GORM,但是這種方式不僅僅適用于 orm 的情況,只是相對(duì)方便一點(diǎn)而已

  1. type DBOption func(*gorm.DB) *gorm.DB 
  2. // IArticleRepo IArticleRepo 
  3. type IArticleRepo interface { 
  4.  WithByID(id uint) DBOption 
  5.  WithByTitle(title string) DBOption 
  6.  GetArticle(ctx context.Context, opts ...DBOption) (*Article, error) 

我們定義一個(gè)的 DBOption 這個(gè) Option 方法會(huì)作為我們 repo 層方法中的最后一個(gè)參數(shù),這樣我們?cè)诙x方法的時(shí)候就可以簡(jiǎn)潔一些,就不必定義很多 GetArticleByXXX 方法了,而是通過(guò)定義很多 WithByXXX 的 Option 方法來(lái)解決。

這樣在 usecase 層,我們只需要這么調(diào)用即可

  1. func (u *article) GetArticle(ctx context.Context, id int) (*domain.Article, error) { 
  2.  // 這里可能有其他業(yè)務(wù)邏輯... 
  3.  return u.repo.GetArticle(ctx, u.repo.WithByID(uint(id))) 

優(yōu)點(diǎn)

復(fù)用: 雖然看上去我們只是把 GetArticleByXXX 換成了 WithByXXX 該有的方法并沒有變少,但是我們拆分之后會(huì)發(fā)現(xiàn)很多可以復(fù)用的方法,例如 WithByID 這種幾乎是每個(gè)實(shí)體都會(huì)有的方法,我們就不用重復(fù)寫了。

  1. // GetArticle 和 GetAuthor 都能用上 
  2. func (u *article) GetArticle(ctx context.Context, id int) (*domain.Article, error) { 
  3.  // 這里可能有其他業(yè)務(wù)邏輯... 
  4.  return u.repo.GetArticle(ctx, u.repo.WithByID(uint(id))) 
  5. func (u *article) GetAuthor(ctx context.Context, id int) (*domain.Author, error) { 
  6.  // 這里可能有其他業(yè)務(wù)邏輯... 
  7.  return u.repo.GetAuthor(ctx, u.repo.WithByID(uint(id))) 

最小化: 這么修改了之后,拆分組合更加方便了,很多查詢條件都可以最小化,例如我們可以添加一個(gè) WithSelects 的方法,我們?cè)?usecase 調(diào)用的時(shí)候就可以傳入當(dāng)前場(chǎng)景只需要關(guān)注的字段就可以了

  1. // GetArticle 返回文章的同時(shí)也需要返回作者的名字 
  2. func (u *article) GetArticle(ctx context.Context, id int) (*domain.Article, error) { 
  3.  article, err := u.repo.GetArticle(ctx, u.repo.WithByID(uint(id))) 
  4.  if err != nil { 
  5.   return err 
  6.  } 
  7.  article.Author, err = u.repo.GetAuthor(ctx, u.repo.WithByArticleID(id), u.repo.WithBySelects("id""name")) 
  8.  return article, err 

可測(cè)性: repo 層的測(cè)試會(huì)變得更加方便,這樣修改之后我們可以將查詢條件拆分出來(lái)進(jìn)行測(cè)試,會(huì)比之前耦合在一起測(cè)試簡(jiǎn)單很多。

抽象: 這種方式可以讓我們抽象 CURD 接口更加方便,在 repo 層實(shí)現(xiàn)的時(shí)候,我們可以直接把 curd 的方法都給抽象出來(lái)

  1. // 這里以創(chuàng)建為例 
  2. func (r *userRepo) optionDB(ctx context.Context, opts ...model.DBOption) *gorm.DB { 
  3.  db := r.db.WithContext(ctx) 
  4.  for _, opt := range opts { 
  5.   db = opt(db) 
  6.  } 
  7.  return db 
  8. func (r *userRepo) create(ctx context.Context, data any, opts ...model.DBOption) error { 
  9.  db := r.optionDB(ctx, opts...) 
  10.  err := db.Create(data).Error 
  11.  if err != nil { 
  12.   return pb.ErrorDbCreateFailf("err: %+v", err) 
  13.  } 
  14.  return nil 

總結(jié)

今天給大家介紹了使用 Function Option 的方式來(lái)寫 repo 層的代碼,接下來(lái)我們就簡(jiǎn)單總結(jié)一下

  1. type DBOption func(*gorm.DB) *gorm.DB 
  2. // IArticleRepo IArticleRepo 
  3. type IArticleRepo interface { 
  4.  WithByID(id uint) DBOption 
  5.  WithByTitle(title string) DBOption 
  6.  GetArticle(ctx con 

優(yōu)點(diǎn)

  • 復(fù)用: 雖然看上去我們只是把 GetArticleByXXX 換成了 WithByXXX 該有的方法并沒有變少,但是我們拆分之后會(huì)發(fā)現(xiàn)很多可以復(fù)用的方法,例如 WithByID 這種幾乎是每個(gè)實(shí)體都會(huì)有的方法,我們就不用重復(fù)寫了。
  • 最小化: 這么修改了之后,拆分組合更加方便了,很多查詢條件都可以最小化,例如我們可以添加一個(gè) WithSelects 的方法,我們?cè)?usecase 調(diào)用的時(shí)候就可以傳入當(dāng)前場(chǎng)景只需要關(guān)注的字段就可以了
  • 可測(cè)性: repo 層的測(cè)試會(huì)變得更加方便,這樣修改之后我們可以將查詢條件拆分出來(lái)進(jìn)行測(cè)試,會(huì)比之前耦合在一起測(cè)試簡(jiǎn)單很多。
  • 抽象: 這種方式可以讓我們抽象 CURD 接口更加方便

缺點(diǎn)

  • 最大的缺點(diǎn)就是有的問(wèn)題在單測(cè)可能測(cè)試不出來(lái)了,usecase 的測(cè)試中,repo 層被 mock 掉了,repo 在測(cè)試的時(shí)候大部分我們只會(huì)測(cè)試當(dāng)前的方法,所以 usecase 有使用比較復(fù)雜的查詢語(yǔ)句的時(shí)候,repo 測(cè)試最好測(cè)一測(cè)真實(shí)的使用場(chǎng)景,不要僅測(cè)試單個(gè) Option 方法

今天的文章就到這里,下篇文章給大家介紹一下 API 定義上的一點(diǎn)小技巧

本文轉(zhuǎn)載自微信公眾號(hào)「mohuishou」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系mohuishou公眾號(hào)。

原文鏈接:https://lailin.xyz/post/operator-09-kubebuilder-code.html

 

責(zé)任編輯:武曉燕 來(lái)源: mohuishou
相關(guān)推薦

2021-01-04 07:57:07

C++工具代碼

2019-09-20 15:47:24

代碼JavaScript副作用

2022-03-11 12:14:43

CSS代碼前端

2021-12-24 09:00:43

Go語(yǔ)言進(jìn)程

2021-03-19 07:23:23

Go架構(gòu)Go工程化

2020-05-14 09:15:52

設(shè)計(jì)模式SOLID 原則JS

2023-09-15 10:33:45

前端工程化commit

2021-06-05 18:01:05

工具Rollup前端

2021-12-07 08:16:34

React 前端 組件

2019-12-24 10:40:53

Java代碼編程

2024-12-04 15:10:21

2024-03-28 14:29:46

JavaScript編程

2020-05-08 14:45:00

JS代碼變量

2021-07-06 10:03:05

軟件開發(fā) 技術(shù)

2023-11-02 09:02:55

Java模式

2018-07-12 14:20:33

SQLSQL查詢編寫

2021-11-22 06:17:26

npm工程化工具

2021-11-08 07:48:48

Go語(yǔ)言對(duì)象

2022-12-01 07:46:01

工程化工具

2018-12-27 09:00:00

Java代碼編程語(yǔ)言
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

www.亚洲人.com| 在线免费亚洲电影| 国产精品有限公司| 国产精品视频久久久久久久| 婷婷国产精品| 欧美色手机在线观看| 影音先锋成人资源网站| 亚洲av无码国产综合专区| 99精品热视频只有精品10| 亚洲人成免费电影| 欧美精品色视频| 蜜桃麻豆影像在线观看| 国产精品嫩草影院com| 92看片淫黄大片看国产片| 国产成人精品片| 成人影视亚洲图片在线| 精品少妇一区二区三区免费观看 | 波多野结衣在线观看一区二区| 欧美群妇大交群中文字幕| 国产freexxxx性播放麻豆| 久久久久久女乱国产| 国产成人丝袜美腿| 国产精品国内视频| 日本免费一二三区| 国产精品99视频| 日韩精品极品视频| www.桃色.com| 国产精品扒开腿做爽爽爽视频软件| 亚洲免费三区一区二区| 日本一区二区三区精品视频| 亚洲高清精品视频| 久久精品国产秦先生| 欧美亚州一区二区三区| 国产免费无码一区二区视频| 国产精品一区二区av日韩在线| 日韩精品中午字幕| 成人av毛片在线观看| 性高爱久久久久久久久| 婷婷丁香久久五月婷婷| 男女啪啪免费观看| 2019中文字幕在线视频| 久久久久久免费网| 国严精品久久久久久亚洲影视| 国产一区二区三区四区视频| 米奇777在线欧美播放| 高清一区二区三区四区五区| 国产av 一区二区三区| 亚洲婷婷丁香| 亚洲国产精品成人精品| 中文字幕无码毛片免费看| 国产私拍福利精品视频二区| 欧美午夜性色大片在线观看| 男人日女人视频网站| 少女频道在线观看高清 | 久久精品国产亚洲av香蕉 | 日本a在线免费观看| av免费在线观看网址| 中文字幕一区二区日韩精品绯色| 丝袜美腿玉足3d专区一区| 亚洲三区在线播放| 97se狠狠狠综合亚洲狠狠| 国产另类自拍| 色婷婷av一区二区三区之红樱桃| 国产不卡高清在线观看视频| 成人激情直播| 亚洲精品一区二区三区蜜桃 | 欧美日韩一区二区三区四区五区六区| 欧美第一在线视频| 日韩精品一区二区三区蜜臀| 性感美女一区二区三区| 波多野结衣在线一区二区 | 国产精品久久91| 国产成人精品亚洲| 免费的国产精品| 91精品久久久久| 999久久久久久| 国产成人精品aa毛片| 国产精品久久久久久免费观看 | 日韩高清不卡av| 青青草视频成人| 久久不见久久见中文字幕免费| 亚洲天堂精品在线| 欧美一区二区三区粗大| 91蜜臀精品国产自偷在线| 日韩网站免费观看| 久久网一区二区| 国产一区导航| 国产精品午夜国产小视频| 97人妻精品一区二区三区软件 | 国产 中文 字幕 日韩 在线| 久久成人av| 久久精品亚洲94久久精品| 久久久久久av无码免费网站| 亚洲一区二区三区免费在线观看| 日韩av免费在线播放| 91亚洲精品国偷拍自产在线观看| 国产成人在线观看| 欧美三级网色| 成人在线观看亚洲| 欧美性少妇18aaaa视频| 亚洲天堂av一区二区| 国产福利资源一区| 伊是香蕉大人久久| 欧美人妻精品一区二区免费看| 一区二区久久| 成人黄色午夜影院| 日中文字幕在线| 国产精品麻豆久久久| 免费在线观看视频a| 日本一区二区电影| 日韩一区二区三区视频| 中国美女乱淫免费看视频| 欧美激情欧美| 庆余年2免费日韩剧观看大牛| 国产精品老熟女视频一区二区| av在线一区二区三区| 亚洲欧洲免费无码| 偷拍自拍在线看| 欧美一级xxx| 色欲AV无码精品一区二区久久 | 久久久不卡网国产精品二区| 男女激烈动态图| 日本另类视频| 亚洲国产日韩欧美在线99| 青花影视在线观看免费高清| 久久午夜视频| 国内精品**久久毛片app| 成人在线播放| 欧美日韩国产成人在线91| 欧美性xxxx图片| 午夜精品av| 国产日韩欧美另类| 高清毛片在线看| 欧美日韩在线一区| 不卡的一区二区| 围产精品久久久久久久| 国产成人高潮免费观看精品| 污视频在线免费| 亚洲自拍偷拍av| 在线观看网站黄| 久久久久久久久99精品大| 国产精品27p| 可以在线观看的黄色| 精品久久中文字幕| 亚洲一二三四五| 影音先锋日韩在线| 91丝袜美腿美女视频网站| 色综合久久久久综合一本到桃花网| 日韩欧美在线国产| 搡老熟女老女人一区二区| 在线播放日韩| 国产精品theporn88| 色呦呦在线观看视频| 日韩欧美精品三级| 可以直接看的黄色网址| 国产一区欧美一区| 亚洲国产精品女人| 精品国产三级| 欧美另类极品videosbestfree| 国产精品久久婷婷| 亚洲精品福利视频网站| 中文字幕乱妇无码av在线| 在线电影一区二区| 成人区精品一区二区| 激情av在线播放| 亚洲成年人影院在线| 国产乡下妇女做爰| wwww国产精品欧美| 99免费视频观看| 日本一区二区在线看| 国产日韩欧美成人| 最新黄网在线观看| 精品毛片乱码1区2区3区| 国产一级免费观看| av一区二区三区四区| www黄色av| 欧美日韩一二| 亚洲在线免费观看| 波多野结衣乳巨码无在线观看| 日韩大陆欧美高清视频区| 国产精品suv一区| 欧美激情在线看| 日韩欧美中文在线视频| 狠狠爱成人网| 欧美精品亚洲| 久久三级毛片| 欧美高清在线视频观看不卡| 天天操天天爱天天干| 91国偷自产一区二区三区观看| 国产又黄又粗又猛又爽的| 国产精品一区二区在线播放 | 日韩电影一二三区| 中文字幕第一页亚洲| 精品亚洲自拍| 国产精品色婷婷视频| 牛牛精品在线| 中文字幕av一区二区| www夜片内射视频日韩精品成人| 欧美日韩激情小视频| 中文字幕第69页| 成人综合婷婷国产精品久久蜜臀 | 欧美日韩在线不卡一区| 四虎影视国产精品| 91黄色8090| 国产在线高清理伦片a| 日韩国产欧美区| 国产老女人乱淫免费| 日韩欧美中文在线| 欧美精品一级片| 国产精品入口麻豆原神| 亚洲av成人片色在线观看高潮| 精品一区在线看| 亚欧无线一线二线三线区别| 天天做天天爱天天爽综合网| 久久精品ww人人做人人爽| 成人污版视频| 国产精品吹潮在线观看| 欧美14一18处毛片| 日韩一区二区久久久| 欧美日韩国产综合视频| 欧美tickling网站挠脚心| 一级黄色片在线| 色香蕉久久蜜桃| 日本午夜精品理论片a级app发布| 国产精品电影院| 男生草女生视频| 丁香激情综合国产| aaaaaaaa毛片| 久久国内精品视频| 狠狠热免费视频| 国产精品婷婷| 亚洲 自拍 另类小说综合图区| 综合av在线| 91社在线播放| 久久精品高清| 亚洲成人自拍| 欧美精品羞羞答答| 国产精品日韩一区二区免费视频| 精品91福利视频| 成人国产在线视频| 欧美高清影院| 国产精品日韩电影| 日日av拍夜夜添久久免费| 91高潮精品免费porn| wwww亚洲| 欧美精品久久久久久久久久| 2024最新电影在线免费观看| 成人97在线观看视频| 色网站在线看| 久久久999精品| 黄色动漫在线观看| 另类图片亚洲另类| 三级资源在线| 国内精品久久久久久| 98色花堂精品视频在线观看| 91精品国产乱码久久久久久久久| 91九色在线看| 26uuu国产精品视频| 女生影院久久| 国产精品第二页| 精品久久99| 成人国产在线视频| silk一区二区三区精品视频 | 伊人影院综合在线| 精品一区中文字幕| www.com日本| 99久久精品免费精品国产| 久久久国产精品无码| 91视频观看视频| 国内精品卡一卡二卡三| 中文字幕在线一区二区三区| 曰本女人与公拘交酡| 亚洲一区二区三区美女| 亚洲 欧美 日韩 综合| 色综合激情久久| 中文字幕在线播放av| 欧美精品久久99| 亚洲国产欧美另类| 亚洲精品动漫100p| 91在线品视觉盛宴免费| 萌白酱国产一区二区| 操人在线观看| 国产不卡在线观看| 国产精品亚洲四区在线观看| 鬼打鬼之黄金道士1992林正英| 欧美大片网址| 亚洲人一区二区| 激情一区二区| 三级a三级三级三级a十八发禁止| 国产乱码字幕精品高清av| 朝桐光av一区二区三区| ww亚洲ww在线观看国产| 天海翼在线视频| 亚洲色图20p| 国产午夜免费视频| 欧美性大战xxxxx久久久| 亚洲av无码国产精品永久一区| 亚洲欧美国产精品| 污污网站在线看| 国产精品成人国产乱一区| 日韩三级av高清片| 欧美黑人xxxxx| 欧美一区二区三区另类| 久久久精品在线视频| 国产精品一区二区三区网站| 色欲av无码一区二区三区| 亚洲视频精选在线| 69xxxx国产| 亚洲成人久久电影| 黄在线免费看| 国产不卡视频在线| 免费观看成人www动漫视频| 一区二区三区在线视频看| 午夜在线精品偷拍| 国产亚洲精品成人a| 中文字幕视频一区| 国产一级做a爱片久久毛片a| 日韩欧美一级二级三级久久久 | 欧美日韩爱爱视频| 成人在线高清| 欧美日韩亚洲一区二区三区在线观看| 欧美fxxxxxx另类| 五月天av在线播放| 第一福利在线| 日韩一区二区电影| 98在线视频| 啪一啪鲁一鲁2019在线视频| 亚洲精品a区| 午夜啪啪福利视频| 免费欧美在线视频| 一级黄色片网址| 色视频欧美一区二区三区| 污污网站免费在线观看| 欧美激情中文网| 老司机亚洲精品一区二区| 一区二区三区在线视频111| 蜜臀久久99精品久久久久宅男 | jizz久久精品永久免费| 欧美精品一区二区性色a+v| 激情综合色播五月| 午夜成人亚洲理伦片在线观看| 欧美三级电影精品| 成人免费在线电影| 国产精品三级久久久久久电影| 九九热爱视频精品视频| 国产精品视频一区二区三区四区五区| av中文字幕在线不卡| www.毛片.com| 亚洲欧美日韩在线高清直播| 中文字幕在线中文字幕在线中三区| 国产精品免费在线播放| 极品av少妇一区二区| 国产chinese中国hdxxxx| 欧美日韩国产激情| 五月天婷婷激情网| 日韩美女在线观看| 精品国产一区二区三区噜噜噜| 久久精品一区二| 中文字幕免费观看一区| 依依成人在线视频| 美女久久久久久久久久久| 精品久久亚洲| 蜜臀av色欲a片无码精品一区| 成人免费精品视频| 五月天婷婷久久| 在线播放日韩欧美| 电影中文字幕一区二区| 成年人深夜视频| 91亚洲精品乱码久久久久久蜜桃| 国产精品第5页| 最新日韩中文字幕| 精品视频在线播放一区二区三区| 国产精品无码电影在线观看| av一本久道久久综合久久鬼色| 久久久久亚洲视频| 操日韩av在线电影| 青草久久视频| 中文字幕第100页| 一区二区三区在线免费观看| 少妇av在线播放| 国产精品av电影| 一区二区三区在线电影| 国产精品无码在线| 欧美三级电影精品| 第四色日韩影片| 大尺度一区二区| 国内偷拍精品视频| 亚洲精品mp4| 热久久久久久| 日本黄色片一级片| 欧美高清在线精品一区| 亚洲av无码一区二区乱子伦| 欧美在线一区二区视频| 99久久精品费精品国产风间由美| 伊人网综合视频| 欧美巨大另类极品videosbest | 中文字幕 91| 亚洲一区二区美女| 午夜看片在线免费| 久久天堂国产精品|