成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go項目模塊劃分、邏輯分層解耦--代碼實戰

開發 項目管理
響應對象是針對客戶端需求的,比如像ID這種在業務內部才有意義的字段可以選擇不暴露出去,只通過orderNo之類的標識請求后端接口就可以了。

這節我以一個簡單的創建訂單功能為例,把邏輯分層解藕的方法論用實際代碼再講解一遍。

圖片圖片

演示按照可能是多數人的一個開發習慣:先定義好Model 、請求、響應等數據對象,再按照自底向上的順序即--DAL->領域服務->應用服務->控制器的順序進行代碼編寫。

數據對象

model

先從Model開始,首先在dal/model 目錄下創建demo.go ,因為還沒有真正開發進行需求的開發,仍然算項目搭建過程中的測試代碼,所以我們把文件命名成了demo.go。

type DemoOrder struct {
 Id        int64                 `gorm:"column:id;primary_key" json:"id"`                  //自增ID
 UserId    int64                 `gorm:"column:user_id" json:"user_id"`                    //用戶ID
 BillMoney int64                 `gorm:"column:bill_money" json:"bill_money"`              //訂單金額(分)
 OrderNo   string                `gorm:"column:order_no;type:varchar(32)" json:"order_no"` //訂單號
 State     int8                  `gorm:"column:state;default:1" json:"state"`              //1-待支付,2-支付成功,3-支付失敗
 PaidAt    time.Time             `gorm:"column:paid_at;default:\"1970-01-01 00:00:00\"" json:"paid_at"`
 IsDel     soft_delete.DeletedAt `gorm:"softDelete:flag"`
 CreatedAt time.Time             `gorm:"column:created_at" json:"created_at"` //創建時間
 UpdatedAt time.Time             `gorm:"column:updated_at" json:"updated_at"` //更新時間
}

這里要說一下 IsDel 這個字段,這個字段被設置成了soft_delete.DeletedAt 類型。這個是GORM V2 中新增的特性讓軟刪除字段支持更多類型,在V1中軟刪除字段必須命名成deleted_at 并且字段在數據庫中的默認值是NULL。

這在很多公司里DBA設置的約束里是不允許的,所以我之前沒有使用過。但是現在GORM V2 支持Flag 模式了,就是咱們很多人用的0代表未刪除 1代表刪除,那么這個特性就可以應用起來了。

使用前需要先安裝GORM的soft_delete這個包。

go get -u "gorm.io/plugin/soft_delete"

在定義模型時給字段設置其類型和Tag標簽

type DemoOrder struct {
 ...
 IsDel        soft_delete.DeletedAt `gorm:"softDelete:flag"`
    ...
}

那么這樣GORM在執行SQL語句時就會自動帶上is_del這個字段進行查詢啦

// Query
SELECT * FROM demo_orders WHERE is_del = 0;

// Delete
UPDATE demo_orders SET is_del = 1 WHERE id = 1;

領域對象

然后是領域對象,在logic/do 目錄中新建 demo.go 文件,在其中定義DemoOrder領域對象

type DemoOrder struct {
 Id        int64     `json:"id"`
 UserId    int64     `json:"user_id"`
 BillMoney int64     `json:"bill_money"`
 OrderNo   string    `json:"order_no"`
 State     int8      `json:"state"`
 IsDel     uint      `json:"is_del"`
 PaidAt    time.Time `json:"paid_at"`
 CreatedAt time.Time `json:"created_at"`
 UpdatedAt time.Time `json:"updated_at"`
}

可以看到這個領域對象和Model對象沒啥區別,確實是這樣的,如果Model的字段都有業務意義那字段基本上完全一樣,對于只針對數據庫有意義的非業務字段就沒必要出現在領域對象中了。

響應對象

響應對象是針對客戶端需求的,比如像ID這種在業務內部才有意義的字段可以選擇不暴露出去,只通過orderNo之類的標識請求后端接口就可以了。

在 api/reply 目錄下我們新建demo.go 并創建響應對象,其跟領域對象的區別是少了id、is_del這種客戶端不需要知道的字段,以及把時間的類型都換成了字符串,我們在創建響應對象時把訂單中的各種時間格式化成字符串再賦給響應對象,這樣控制器拿到響應對象后直接返回就可以啦。

type DemoOrder struct {
 UserId    int64  `json:"user_id"`
 BillMoney int64  `json:"bill_money"`
 OrderNo   string `json:"order_no"`
 State     int8   `json:"state"`
 PaidAt    string `json:"paid_at"`
 CreatedAt string `json:"created_at"`
 UpdatedAt string `json:"updated_at"`
}

請求對象

此外我們還在 api/request 目錄下的demo.go 中定義了創建訂單的請求對象

type DemoOrderCreate struct {
 UserId    int64 `json:"user_id"`
 BillMoney int64 `json:"bill_money" binding:"required"`
 // 這個字段演示的時候因為沒創建訂單快照表所以不寫庫
 OrderGoodsId int64 `json:"order_goods_id" binding:"required"`
}

在Controller接收到請求后,它會利用Gin提供的數據驗證和綁定幫我們驗證請求數據然后把它們綁定到請求對象上。

Copier

這里我們先暫停一下, 很多人可能會有疑問你搞那么多對象,到時候得多寫多少代碼呀?

那么這里我就介紹一下這個工具"github.com/jinzhu/copier",也是GORM的作者開發的,它的作用類似于Java的BeanUtils.copyProperties 把源對象中的字段拷貝到目標對象中去。

我在項目common/util/copy.go中封裝了一個工具函數幫我們完成數據拷貝,同時還定義了從時間對象轉換成時間字符串的轉換器,讓我們在拷貝數據的同時完成time.Time類型字段的格式化。這樣從領域對象轉換成返回給客戶端使用的響應對象的時就不需要再手動轉換了。

使用我們的數據轉換工具util.CopyProperties后上面的代碼可以直接簡化成下圖這樣

圖片圖片

使用util.CopyProperties即可完成數據對象的轉換,不需要我們在一個字段一個字段的去復制了,也省去了經常做的時間轉換的操作。

這個工具必不可少的會使用反射來完成數據復制,如果對性能很敏感,可以自己寫一些領域對象到響應對象的Convertor方法,如果量大嫌自己寫的麻煩,可以研究一下用Go編譯的AST ,在編譯時自動生成這些Convertor方法。

責任編輯:武曉燕 來源: 網管叨bi叨
相關推薦

2012-07-10 01:47:14

代碼架構設計

2024-09-29 09:58:57

2025-05-15 09:05:19

Go項目BDD測試

2022-09-02 08:23:12

軟件開發解耦架構

2025-03-13 09:22:39

2024-11-13 09:13:45

2013-09-16 10:19:08

htmlcssJavaScript

2016-11-30 15:30:42

架構工具和方案

2025-04-28 01:55:00

工具sqlmockSQL

2021-03-10 05:50:06

IOCReact解耦組件

2025-05-20 07:13:22

Spring異步解耦Event

2024-03-08 16:27:22

領域事件DDD項目跨層解耦

2020-11-20 15:22:32

架構運維技術

2024-06-11 00:00:05

RabbitMQAMQP協議

2025-06-27 02:33:00

ServiceSpring事件

2018-04-18 08:47:17

Alluxio構建存儲

2022-04-15 11:46:09

輕量系統解耦鴻蒙操作系統

2022-09-27 09:21:34

SOLID開閉原則Go

2017-11-08 13:31:34

分層架構代碼DDD

2021-01-07 10:30:23

設計模式
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人性视频在线播放 | 99久久精品国产一区二区三区 | 精品三区| 久久国产精品无码网站 | 综合久久国产 | 日日夜夜天天综合 | 四虎永久免费在线 | 91在线精品视频 | 精品成人av| 国产精品国产精品国产专区不卡 | 精品久久久av | 国产激情一区二区三区 | 久久国产精品91 | 成人高清视频在线观看 | 男人的天堂中文字幕 | 91高清在线视频 | 羞羞涩涩在线观看 | 亚洲性视频 | 欧美日韩亚洲一区 | 日韩精品福利 | 99亚洲精品视频 | 久久国产精品视频 | 国产高清精品在线 | 国产精品久久免费观看 | 精品久久一 | 国产高清在线精品 | 91国内精品 | 成年网站在线观看 | 免费观看毛片 | 日韩欧美一区二区三区 | 影视一区 | 欧美一区二区三区 | 欧美成人精品一区二区男人看 | 国产精品久久久久aaaa樱花 | 日本成年免费网站 | 欧美一区二区三区四区在线 | 国产精品久久久久久妇女 | 一区二区国产在线观看 | 国产999精品久久久久久 | 成人免费视频 | 国产资源在线视频 |