go - 重新设计循环依赖缺陷

标签 go software-design circular-dependency

我有一堆共享一些通用包的小服务,如 LoggerConfigurationNet。我在单独的项目中编写了每个包。 问题是我的 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/

相关文章:

go - 从 Websockets 读取数据的最佳方式

go - 我应该使用 panic 还是返回错误?

go - 在浏览器中本地查看包文档

web-applications - 为移动和 Web 应用程序设计通用服务器端

testing - 是否可以在 C# 中使用我的 PC 指纹?

go - 在GoBuster中找不到单词表

c++ - 循环依赖通常会花费很多时间来编译吗?

f# - 使用循环引用设计和更好的选项对不可变类进行批判

java - 如何在 Spring 中为(非静态)内部类定义一个 bean?避免循环依赖

database - 将 Web 服务中的数据缓存到数据库中是个好主意吗?