【发布时间】:2018-02-18 21:08:08
【问题描述】:
我是 Golang 的初学者,我正在开发一个小型库,该库需要在代码中的某个位置获取数据库连接以进行不同的子包/方法调用。我只是想知道我该如何管理这个?
例如,如果我设法拥有一个网络服务器,它可以与处理程序一起使用,那么我怎样才能在这个函数中获得这个连接? 它可以与另一个进程、简单的方法调用或 MVC 模型一起使用吗?
我不想使用 global,因为对我来说这是一种不好的做法,除非它是非常特殊的方式(或以某种方式棘手)。
我在不同的网站上阅读了很多文章,但我仍然在询问和学习不同的意见和经验。
感谢您的宝贵时间!
【问题讨论】:
-
那里有很多不错的软件包。但是工厂方法的简单映射也可以(在很多情况下,但不是全部)。
-
一个库、框架,甚至工厂地图几乎可以肯定是不必要的过度复杂化。依赖注入只是意味着如果 Foo 需要一个 Bar,Foo 不创建 Bar,Foo 从任何创建/调用 Foo 的对象接收 Bar。
-
@KavehShahbazian 是的,我尝试使用 map[string]interface{} 实现一个简单的接口,但我认为我需要更多练习才能了解一些要求,例如注入器/类型..
-
@Adrian 我同意你的观点 :) 但是找到一个注入它们的好方法/过程会很好。现在我找到了一种方法,比如创建一个上下文,将我的实例存储在里面,然后将这个上下文提供给我需要它的结构,但我真的不喜欢这个
-
根据我的卑微经验,
context.Context.Value()(充其量)是一种疾病。应该避免它。 (恕我直言)context.Context是实现取消层次结构的最佳方式(结合sync.WaitGroup进行确认)。context.Context本质上是不可变的,这是一件好事。值部分实际上应该只在请求范围内使用(我也从未将它用于此目的)。