1 回答

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)衡利弊。
更新:
使用 ServeHTTP(w http.ResponseWriter, r *http.Request) 方法將控制器實(shí)現(xiàn)為結(jié)構(gòu)。
main.go
如果該結(jié)構(gòu)如上所述,則創(chuàng)建實(shí)例。router.Handle
使用而不是將該結(jié)構(gòu)集成到路由器中router.HandleFunc
使用 struct,您應(yīng)該可以更好地控制 Controller 依賴(lài)項(xiàng)生命周期。
- 1 回答
- 0 關(guān)注
- 105 瀏覽
添加回答
舉報(bào)