我有很多小型服务,它们共享一些常见的软件包,例如Logger
,Configuration
和Net
。我在分开的项目中编写了每个包。
问题是我的Logger
需要包Configuration
才能进行设置。我的Configuration
( 仅由Logger
使用)想要在必要时编写输出日志。
因此,我有循环依赖缺陷Logger
- > Configuration
,Configuration
- > { {1}}。
如何重新设计此代码?
答案 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)
答案 2 :(得分:1)
我不知道你的Configuration
包的确切含义,但我不认为Logger
应该依赖Configuration
包。
最后,您可能想以某种方式配置记录器。 IMO这个配置不应该只是一个结构。所以一个解决方案可能是: