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 关注
- 83 浏览
添加回答
举报