如何解决Go循环依赖

触摸:

我一直在学习Go语言课程,我对语言感到非常兴奋,它对于Web服务确实非常有用。

因此,我一直在为最终项目编写此CRUD静态API,并且继续运行该死的循环依赖问题。我已经研究并阅读了解决方法,仅出于此目的而将其发布在这里,但首先是我遇到的问题:

路由需要了解处理程序中的处理程序功能,而后者又需要了解模型程序包内的用户结构,为了发送带有链接的注册电子邮件,需要了解路由路径

经典A-> B-> C-> A

现在,我正在尝试使用MVC和三层体系结构来编写此API,我希望我的路由位于控制器包中,处理程序位于业务逻辑包中,而用户位于模型包中。这也是需要的,因为我有超过43个模型类,我需要他们整理一下并藏在它们的包装上。

好,我找到的解决方案

1-将所有人扔到同一个包装上:到目前为止,这是我一直在做的事情,但是出于明显的原因,这是一个非常糟糕的解决方案。

2- 在调用函数时将用户需要的任何参数作为参数传递:这将是一个很好的解决方案,但是将无法正常工作,因为从用户调用的函数来自接口实现,因为它必须是通用调用,并且在调用之前有人四处说我的问题是因为我要强制使用泛型,太糟糕了,我需要该泛型,因此我不会编写超过160个crud函数。功能的全部目的是避免代码重复。

3- 创建具有另一个接口的另一个程序包,并使其具有处理程序和用户的实例,并将其从一个传递到另一个:尽管有上述原因,但需要通用,这听起来像是不必要的复杂解决方案,我拒绝相信这是比循环依赖更好的设计。

底线问题:当C需要了解A的信息并且泛型时,如何解决这种依赖性

如果需要,我可以在此处发布一些代码,但是当这只是一个高级问题时,我看不到特定代码的相关性。

编辑:解决了我的依赖问题。谢谢大家的评论和回答,因为它使我找到了答案。我认为我没有实施建议的任何解决方案,但是它确实教会了我很多解决问题的方法,如果不是我自己的约束,那么这些解决方案都是非常可接受且可行的解决方案不想将任何东西传递给用户。对于试图解决自己的依赖关系问题的任何人,我能够收集的是,而不是在我的情况下,C向A询问某事,在需要询问之前将所需的任何东西交给C,这意味着将信息传递给他。

,那不是我的解决方案,我要做的是从A中删除信息,然后将信息提供给Z,现在A和C都在询问到Z的路径信息,Z只是一个Map,坐在那里像和持有信息。谢谢你们

阿德里安:

您有一些选择,并且找到了一些。处理此问题的主要方法是:

  • 重构设计,将循环变成一棵树。由于您的要求,这实际上不适用于您的情况。
  • 重构您的设计以使用某种依赖注入(这是您问题中的第二个选择)。这是完全可行的,并且可能是最干净,最容易的。
  • 重构您的设计以采用本地声明的接口。这是选项3的更通用的Go版本。由于Go中的接口是鸭子类型的,因此您可以在使用它的地方(而不是在实现的地方)定义它。因此,您的用户程序包可以为“给我所需的URL的东西”定义一个方法接口,而无需引用实现该接口的程序包。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章