什么是循环依赖,我该如何解决?

Ele*_*ios 6 .net c# vb.net circular-dependency visual-studio

脚本


我有一个解决方案,我有(超过)2个项目.

第一个项目有一个项目引用第二个项目.第二个项目没有第一个项目的参考.

好吧,在第一个项目中,我定义了一个可继承的类类型,我希望第二个项目中的某些类继承它.

问题


显然,如果我想继承第一个项目中定义的类型,在第二个项目中我需要向第一个项目添加项目引用,以便能够看到类型并继续.

问题是,当我尝试添加项目引用时,我收到此错误消息:

循环依赖性错误


有人可以用其他简单的单词解释我(也许在代码的例子中也隐含在错误中)什么是循环依赖?,最重要的是:我能做些什么来解决它?(请在回答之前阅读我研究的最后一部分).

研究


这是我第一次听到" 循环依赖 "一词; 我从MSDN上读过这篇文章,但我什么都不懂.

无论如何,我看到很多像这样的循环依赖的问题,从我在那个问题中看到的看来,循环依赖意味着两个项目不能同时引用它们,这两个项目中只有一个可以引用另一个; 并且在那个问题中回答的所有人都说" 重新设计是解决方案 "或" 循环依赖不是好的做法 ",但是,在我的案例中重新设计将意味着在两个项目中定义相同的类型,我认为这也不是好的做法,当然,建立一个额外的程序集/项目只是为了存储一个类型来引用两个项目中的程序集......这是我认为最糟糕的想法.

Chr*_*isF 18

循环依赖是项目A依赖于项目B中的某些内容而项目B依赖于项目A中的某些内容.这意味着要编译项目A,您必须首先编译项目B,但是您不能这样做,因为B要求A编译.这是循环依赖导致的问题.

如果为已经构建的项目引入循环依赖项,则很难发现,因为标准构建选项不会删除现有的目标文件,从而使您能够首先构建A(或B).当你尝试使用之前从未构建过解决方案的另一台机器或者如果你进行干净和构建时,你只会发现它.

在我的案例中重新设计意味着在两个项目中定义相同的类型,我认为这也不是好的做法.

在这种情况下,您需要创建第三个项目"C",其中包含A和B所依赖的类,因此它们不再相互依赖.您可能只需将类拆分,以便可以按照这种方式对依赖项进行排序,而无需创建第三个项目.

  • @ElektroStudios 如果您的问题是“为什么我不能有循环依赖?” 而不是“什么是循环依赖以及我该如何解决它?”,您可能想要编辑您的问题以明确这一点。 (2认同)
  • @ElektroStudios 因为顾名思义,循环依赖是循环的,所以编译器无法判断哪个项目先运行。从哲学上讲,它会问计算机谁先来,先有鸡蛋还是先有鸡? (2认同)

Mar*_*ans 13

什么是依赖?

为了理解循环依赖是什么,最好理解什么是依赖性以及它对编译器意味着什么.

假设您有一个项目,并且在类中,您定义了以下内容:

Public Class MyClass
    'Some code here
    Private MyString As String
    'Some code there
End Class
Run Code Online (Sandbox Code Playgroud)

编译项目时,编译器会运行String类,该类在名为System的DLL文件中定义.然后它会将该DLL链接到您的项目,因此在运行时,在对字符串定义或执行操作时,将加载System.dll以执行这些操作.

现在,让我们假设您在课堂上有以下定义

'Some code here
Private MyObjet as CustomClass1
'Some code there
Run Code Online (Sandbox Code Playgroud)

让我们说CustomClass1在你的另一个项目中定义,名为Project2.DLL:

Public Class CustomClass1
    'Your customr class code
End Class
Run Code Online (Sandbox Code Playgroud)

因此,在编译第一个项目时,编译器将进入CustomClass1定义,它知道它存在于Project2.dll中,因此之前将编译Project2,以便能够在第一个项目中添加该引用.

这就是一种依赖,它是等级的,必须有一个起点.甚至String类依赖于其他类,最后,它们都依赖于字节或位来完成工作,因为这是计算机可以做的唯一事情,玩10.

所以圆形部分

因此,如果您在Project2中有一个链接到第一个项目的引用(字段定义或类似内容),会发生什么?

  • 编译器会读取您的第一个项目,然后运行 CustomClass1
  • 然后它尝试编译Project2,因为在那里定义了CustomClass1
  • 然后它运行到第一个项目中定义的类
  • 它尝试编译您的第一个项目,以便将其链接到第二个项目
  • 然后它运行到 CustomClass1
  • 然后它尝试编译Project2
  • 我猜你得到了......

所以在某些时候编译器显示错误,说它无法编译,因为它不明白你要做什么...

是的,电脑是那么愚蠢.

怎么解决?

解决这类问题有时很困难,但基本思想是建立一个层次结构,将基类(不需要依赖的基类)放在一起,然后在它们上构建.

将所有依赖于彼此的类放在一起,它们形成了一个层,用于在应用程序中尝试执行的操作.