在 Golang 中进行依赖注入的最佳方法是什么

Vin*_*ent 7 dependency-injection go

我是 Golang 的初学者,我正在开发一个小型库,该库需要在代码中的某个点为不同的子包/方法调用获取数据库连接。我只是想知道我该如何管理?

例如,如果我设法拥有一个网络服务器,它可以与处理程序一起使用,那么我如何在此函数中获得此连接?它可以与另一个进程、简单的方法调用或 MVC 模型一起使用吗?

我不想使用 global 因为对我来说这是一个不好的做法,除非它是非常特殊的方式(或以某种方式棘手)。

我在不同的网站上阅读了很多文章,但是,我仍然在询问和学习不同的意见和经验。

谢谢你的时间 !

ZAk*_*Aky 3

创建一个表示资源\xe2\x80\x8b 的结构体,让我们调用 Cart. 向该结构添加 get 和 post 方法。这些方法应该是 http 处理程序。在 main 中创建带有 db 接口的结构实例。并在路由中调用 Cart.get。现在在 get 方法中您可以访问数据库接口。

\n\n

不是一个有效的示例,只是为了了解注入测试的想法。

\n\n
type storage interface {\n    PrepareContext(context.Context, string) (*sql.Stmt, error)\n}\n\nfunc main() {\n    db, _ := sql.Open("mysql", `queryString`)\n    http.HandleFunc("/", Cart{db}.get)\n    http.ListenAndServe(":8080", nil)\n}\n\ntype Cart struct {\n    storage\n}\n\nfunc (crt Cart) get(w http.ResponseWriter, r *http.Request) {\n    q, _ := crt.PrepareContext(context.Background(), `select *`)\n    fmt.Println(q.Exec())\n}\n\n/////////Test\ntype testDB struct{}\n\nfunc (c testDB) PrepareContext(context.Context, string) (*sql.Stmt, error) {\n    return nil, nil\n}\nfunc TestGet(t *testing.T) {\n    db := testDB{}\n    _ = Cart{db}\n\n    //http test here\n}\n
Run Code Online (Sandbox Code Playgroud)\n