我有一堆共享一些通用包的小服务,如 Logger
、Configuration
和 Net
。我在单独的项目中编写了每个包。
问题是我的 Logger
需要包 Configuration
进行设置。而我的Configuration
(不仅供Logger
使用)想要在必要时写入输出日志。
因此,我有循环依赖缺陷Logger
-->Configuration
, Configuration
- ->记录器
。
如何重新设计此代码?
最佳答案
今年的 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)
如果您的记录器需要配置中的一些设置来初始化自身,您可能还会遇到“先创建什么”的问题。我通过创建具有合理默认值的记录器、使用默认记录器创建配置对象然后根据加载的配置调整记录器来避免这种情况。这意味着您暂时拥有一个未正确配置的记录器,但您唯一用它做的事情是用它来记录配置的加载。
关于go - 重新设计循环依赖缺陷,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48221414/