第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

使用存儲(chǔ)庫(kù)模式時(shí)如何在 Go 中處理數(shù)據(jù)庫(kù)連接?

使用存儲(chǔ)庫(kù)模式時(shí)如何在 Go 中處理數(shù)據(jù)庫(kù)連接?

Go
GCT1015 2023-01-03 14:01:08
假設(shè)我有一個(gè)非常簡(jiǎn)單的存儲(chǔ)庫(kù)接口,它只從目標(biāo)數(shù)據(jù)庫(kù)讀?。簍ype UserRepository interface {    read(ctx context.Context, id WHAT_TYPE_I_SHOULD_USE_HERE) models.User}注意:請(qǐng)注意,在 id 參數(shù)中,我不知道用戶(hù)作為 id 類(lèi)型是什么,因?yàn)?id 在MongoDB基于ObjectId模式的數(shù)據(jù)庫(kù)中它可能是一個(gè)UUID字段。如果有幫助,我的主數(shù)據(jù)庫(kù)是 MongoDB,但我可能會(huì)切換到基于模式的數(shù)據(jù)庫(kù)?,F(xiàn)在我有一個(gè)附加到它的MongoDBRepository結(jié)構(gòu):read()type MongoDBRepository struct {}func (mo MongoDBRepository) read(ctx context.Context, id primitive.ObjectID) {    fmt.Printf("read user %s from MongoDB", id)}我有一個(gè)連接到 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}現(xiàn)在,隨著接口的實(shí)現(xiàn),我們可以為MySQL/PostgreSQL和ConnectMySQL/擁有一個(gè)類(lèi)似的存儲(chǔ)庫(kù)ConnectPostgreSQL。我遇到的問(wèn)題是在我的主要功能中我應(yīng)該如何處理連接到我當(dāng)前的數(shù)據(jù)庫(kù)存儲(chǔ)庫(kù)以及如何在我的控制器中使用它來(lái)讀取或更新文檔/記錄?當(dāng)我將連接傳遞給控制器方法時(shí),其類(lèi)型設(shè)置為*mongo.Client如何將其抽象化,以便獲取數(shù)據(jù)庫(kù)連接的控制器方法未綁定到目標(biāo)數(shù)據(jù)庫(kù)類(lèi)型?
查看完整描述

1 回答

?
狐的傳說(shuō)

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超3個(gè)贊

我應(yīng)該如何處理連接到我當(dāng)前的數(shù)據(jù)庫(kù)存儲(chǔ)庫(kù)以及如何在我的控制器中使用它來(lái)讀取或更新文檔/記錄


我一直在檢查提供商文檔以獲取有關(guān)該問(wèn)題的提示。


經(jīng)過(guò)快速搜索,我在Github中找到了我需要的東西:


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

// multiple goroutines. 

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


從存儲(chǔ)庫(kù)開(kāi)始。我們需要注入客戶(hù)端:


type MongoDBRepository struct {

   Client mongo.Client

}

在當(dāng)前的設(shè)計(jì)中,存儲(chǔ)庫(kù)僅包含線(xiàn)程安全成員,因此它本質(zhì)上是線(xiàn)程安全的。


這是在應(yīng)用程序啟動(dòng)代碼中創(chuàng)建存儲(chǔ)庫(kù)的代碼:


repo := &MongoDBRepository{Client: client}

在控制器中,我們定義Repository為接口類(lèi)型,但我們將注入MongoDBRepository結(jié)構(gòu):


// Controller Code

type UserController struct {

   Repo UserRepository

}

控制器的啟動(dòng)代碼也應(yīng)該發(fā)生在應(yīng)用程序之星上:


// App start 

controller := &UserController{Repo: repo}

要處理數(shù)據(jù)庫(kù)特定類(lèi)型 ( id WHAT_TYPE_I_SHOULD_USE_HERE),您需要將它們實(shí)現(xiàn)為泛型。它可能會(huì)使您的控制器代碼變得相當(dāng)復(fù)雜??紤]將這種復(fù)雜性隱藏在存儲(chǔ)庫(kù)中,并公開(kāi)一些簡(jiǎn)單的東西,如字符串或 uuid。


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


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

更新:

  1. 使用 ServeHTTP(w http.ResponseWriter, r *http.Request) 方法將控制器實(shí)現(xiàn)為結(jié)構(gòu)。

  2. main.go如果該結(jié)構(gòu)如上所述,則創(chuàng)建實(shí)例。

  3. router.Handle使用而不是將該結(jié)構(gòu)集成到路由器中router.HandleFunc

使用 struct,您應(yīng)該可以更好地控制 Controller 依賴(lài)項(xiàng)生命周期。


查看完整回答
反對(duì) 回復(fù) 2023-01-03
  • 1 回答
  • 0 關(guān)注
  • 105 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)