重新设计循环依赖缺陷

时间:2018-01-12 07:22:25

标签: go software-design circular-dependency

我有很多小型服务,它们共享一些常见的软件包,例如LoggerConfigurationNet。我在分开的项目中编写了每个包。 问题是我的Logger需要包Configuration才能进行设置。我的Configuration 仅由Logger使用)想要在必要时编写输出日志。

因此,我有循环依赖缺陷Logger - > ConfigurationConfiguration - > { {1}}。

如何重新设计此代码?

3 个答案:

答案 0 :(得分:2)

今年在GopherCon上发生了类似的事情,其中​​Edward Muller认为配置结构会增加应用程序中的耦合。配置包只是一个极端版本。他认为,依赖性应该只是接受它实际需要的配置而不是整个结构(或者在这种情况下是包)。你可以在这里看到他演讲的这一部分:

https://www.youtube.com/watch?v=ltqV6pDKZD8

或者是文字版本:

https://about.sourcegraph.com/go/idiomatic-go/#config-structs

他的解决方案的本质是让你做主要的事情:

logSetting1 := configuration.GetLogSetting1()
logSetting2 := configuration.GetLogSetting2()
logger.SetSettings(logSetting1, logSetting2)

你可能还会有一个"首先创建的内容"如果您的记录器需要配置中的某些设置以初始化自身,则会出现问题。我通过创建具有合理默认值的记录器来避免这种情况,使用默认记录器创建配置对象,然后根据加载的配置调整记录器。这意味着您暂时没有正确配置的记录器,但使用它的事件用于记录配置的加载。

答案 1 :(得分:1)

通常通过创建具有其他两个依赖关系的第三个模块来解决该问题: enter image description here

答案 2 :(得分:1)

我不知道你的Configuration包的确切含义,但我不认为Logger应该依赖Configuration包。

最后,您可能想以某种方式配置记录器。 IMO这个配置不应该只是一个结构。所以一个解决方案可能是:

  1. 将记录器相关配置放入记录器包中的struct
  2. 让配置包生成logger config struct
  3. 在配置包或某些高级包
  4. 中初始化记录器