亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用存儲庫模式時如何在 Go 中處理數據庫連接?

使用存儲庫模式時如何在 Go 中處理數據庫連接?

Go
GCT1015 2023-01-03 14:01:08
假設我有一個非常簡單的存儲庫接口,它只從目標數據庫讀取:type UserRepository interface {    read(ctx context.Context, id WHAT_TYPE_I_SHOULD_USE_HERE) models.User}注意:請注意,在 id 參數中,我不知道用戶作為 id 類型是什么,因為 id 在MongoDB基于ObjectId模式的數據庫中它可能是一個UUID字段。如果有幫助,我的主數據庫是 MongoDB,但我可能會切換到基于模式的數據庫?,F在我有一個附加到它的MongoDBRepository結構:read()type MongoDBRepository struct {}func (mo MongoDBRepository) read(ctx context.Context, id primitive.ObjectID) {    fmt.Printf("read user %s from MongoDB", id)}我有一個連接到 MongoDB 的方法:func ConnectMongoDB() (*mongo.Client, context.CancelFunc) {    client, err := mongo.NewClient(options.Client().ApplyURI(configs.MongoURI()))    if err != nil {        log.Fatal(err)    }    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)    err = client.Connect(ctx)    err = client.Ping(ctx, nil)    if err != nil {        log.Fatal(err)    }    log.Print("Successfully connected to MongoDB!")    return client, cancel}現在,隨著接口的實現,我們可以為MySQL/PostgreSQL和ConnectMySQL/擁有一個類似的存儲庫ConnectPostgreSQL。我遇到的問題是在我的主要功能中我應該如何處理連接到我當前的數據庫存儲庫以及如何在我的控制器中使用它來讀取或更新文檔/記錄?當我將連接傳遞給控制器方法時,其類型設置為*mongo.Client如何將其抽象化,以便獲取數據庫連接的控制器方法未綁定到目標數據庫類型?
查看完整描述

1 回答

?
狐的傳說

TA貢獻1804條經驗 獲得超3個贊

我應該如何處理連接到我當前的數據庫存儲庫以及如何在我的控制器中使用它來讀取或更新文檔/記錄


我一直在檢查提供商文檔以獲取有關該問題的提示。


經過快速搜索,我在Github中找到了我需要的東西:


// Client is a handle representing a pool of connections to a MongoDB deployment. It is safe for concurrent use by

// multiple goroutines. 

客戶端是線程安全的,代表的不是單個連接而是一個連接池。這意味著我可以在 Controllers/Repositories 的多個實例之間共享一個 Client 實例,并且客戶端可以處理它。


從存儲庫開始。我們需要注入客戶端:


type MongoDBRepository struct {

   Client mongo.Client

}

在當前的設計中,存儲庫僅包含線程安全成員,因此它本質上是線程安全的。


這是在應用程序啟動代碼中創建存儲庫的代碼:


repo := &MongoDBRepository{Client: client}

在控制器中,我們定義Repository為接口類型,但我們將注入MongoDBRepository結構:


// Controller Code

type UserController struct {

   Repo UserRepository

}

控制器的啟動代碼也應該發生在應用程序之星上:


// App start 

controller := &UserController{Repo: repo}

要處理數據庫特定類型 ( id WHAT_TYPE_I_SHOULD_USE_HERE),您需要將它們實現為泛型。它可能會使您的控制器代碼變得相當復雜??紤]將這種復雜性隱藏在存儲庫中,并公開一些簡單的東西,如字符串或 uuid。


使用這種方法,您可以輕松地在不同的數據庫之間切換。您需要更改的只是應用程序初始化 ( Composition Root ) 而無需更改控制器代碼。


PS 多數據庫支持非常昂貴。我們已經遇到了 ID 類型的問題。將來,您應該準備好停止使用任何特定于數據庫的功能,而只使用跨所有數據庫可用的功能。數據庫事務是 Mongo 中不可用的重要 SQL 功能之一。在完全致力于多種數據庫類型之前權衡利弊。

更新:

  1. 使用 ServeHTTP(w http.ResponseWriter, r *http.Request) 方法將控制器實現為結構。

  2. main.go如果該結構如上所述,則創建實例。

  3. router.Handle使用而不是將該結構集成到路由器中router.HandleFunc

使用 struct,您應該可以更好地控制 Controller 依賴項生命周期。


查看完整回答
反對 回復 2023-01-03
  • 1 回答
  • 0 關注
  • 101 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號