Go 不同阶段的依赖注入和IoC

Go 不同阶段的依赖注入和IoC,go,dependency-injection,inversion-of-control,Go,Dependency Injection,Inversion Of Control,我花了大约一天的时间发现了在Go中管理依赖关系的最佳方法。我读过很多关于以下方面的文章: go.uber.org/fx go.uber.org/dig github.com/google/wire github.com/elliotchance/dingo github.com/sarulabs/dingo 还有更多 所有这些函数的作用几乎相同(但使用不同的方法),看起来这是它的主要目的——只需将main()函数变小即可。它们不能解决我的需求,也就是说,根据我的环境返回我需要的接口。但是我希

我花了大约一天的时间发现了在Go中管理依赖关系的最佳方法。我读过很多关于以下方面的文章:

  • go.uber.org/fx
  • go.uber.org/dig
  • github.com/google/wire
  • github.com/elliotchance/dingo
  • github.com/sarulabs/dingo
  • 还有更多
所有这些函数的作用几乎相同(但使用不同的方法),看起来这是它的主要目的——只需将
main()
函数变小即可。它们不能解决我的需求,也就是说,根据我的环境返回我需要的接口。但是我希望根据我的环境有不同的实例

例如,对于开发,我需要一个本地文件系统作为存储,但是对于生产,S3适配器应该从依赖关系管理器返回

另一个例子是电子邮件适配器:出于本地目的,将其保存在日志中就足够了,对于登台/演示,我希望能让它处于空闲状态,但对于生产,我希望使用一些提供商发送真正的电子邮件

是否可以避免手动写入条件(长列表的
if
s)并使用当前环境动态获取?我想分割所有这些基础结构代码,让依赖关系管理器决定应该返回什么

我将非常感谢任何有价值的答案,因为我现在陷入困境,并且只有一个手动编写条件的想法。

一个
if
s列表将根据
if
s中的任何条件动态获取它。围棋谚语是“一点复制比一点依赖要好”,也就是说,一般来说,只写一些简单的逻辑比搜索一个过于复杂的第三方库要好,这样你就不用写一些简单的逻辑了。