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 功能之一。在完全致力于多種數據庫類型之前權衡利弊。
更新:
使用 ServeHTTP(w http.ResponseWriter, r *http.Request) 方法將控制器實現為結構。
main.go
如果該結構如上所述,則創建實例。router.Handle
使用而不是將該結構集成到路由器中router.HandleFunc
使用 struct,您應該可以更好地控制 Controller 依賴項生命周期。
- 1 回答
- 0 關注
- 101 瀏覽
添加回答
舉報