【问题标题】:Circular Dependency among two Projects of Different Solution不同解决方案的两个项目之间的循环依赖
【发布时间】:2015-03-23 16:17:46
【问题描述】:

假设有两个 .net 项目不在同一个解决方案下。 ProjectA 在solution1 下,ProjectB 在solution2 下。 ProjectA 有 ProjectB 的引用,ProjectB 有 ProjectA 的引用。有两个类 ProjectA_Class 和 ProjectB_Class。 ProjectA_Class 创建 ProjectB_Class 的对象,ProjectB_Class 创建 ProjectA_Class 的对象。

namespace ProjectB
{
    public class ProjectB_Class
    {
        public ProjectB_Class()
        {
            ProjectA_Class projA = new ProjectA_Class();
        }
    }
}

namespace ProjectA
{
    public class ProjectA_Class
    {
        public ProjectA_Class()
        {
            ProjectB_Class projB = new ProjectB_Class();
        }
    }
}

我对循环依赖感到困惑。尽管它们不在同一个解决方案中,但它不是在两个类之间创建循环依赖吗?我们知道这两个项目是否驻留在同一个解决方案中,Visual Studio 不允许我们在 ProjectB 中引用 ProjectA,在 ProjectA 中引用 ProjectB,因为它会创建循环依赖。尽管它们不在同一个解决方案中,但它是否仍然在两个项目之间创建循环依赖?假设ProjectA中有一个类C,它创建了一个ProjectB_Class的对象,而ProjectB_Class没有使用任何C类的实例。难道ProjectA和ProjectB都有相互引用的循环依赖吗?

更新 1 你能解释一下循环依赖的情况吗?

【问题讨论】:

  • 是的,它是一个循环依赖。你有什么问题?
  • 看来你的问题应该是“为什么 VS 不警告这些循环依赖?”
  • 实际上我和一个人就这个问题发生了争执,他告诉我,由于他们存在于不同的解决方案中,所以这不是循环依赖。当 ProjectA 中有一个 C 类创建 ProjectB_Class 的对象并且 ProjectB_Class 不使用 C 类的任何实例时,你能解释一下它是如何成为循环依赖的吗?
  • 也许对不同种类的循环依赖存在混淆。起初我以为您在谈论循环 build 依赖,现在我从答案中看到这里涉及一种更基本的循环依赖。
  • 您能否解释一下两个项目上下文中的循环构建依赖关系?

标签: c# .net circular-dependency circular-reference design-principles


【解决方案1】:

是的,是循环依赖。

解决方案和项目只是组织文件的一种方式,但事实仍然是,如果 2 个类相互引用,则无论它们是否在同一个解决方案中,都被视为循环依赖。

【讨论】:

  • 如果ProjectA中有一个类C创建了ProjectB_Class的对象,而ProjectB_Class没有使用C类的任何实例,但ProjectA和ProjectB都有相互引用,会出现什么情况?
  • 如果您的 C 类调用 A 类中的一个方法,该方法对 B 类执行某些操作,那么这很好,但如果您在 A 类中使用 C 类中的 B 类,那么这首先违反了 LOD。其次,如果您是 B 类,仍然在其中实例化 A 类,那么是的,这种情况也会产生循环依赖。
【解决方案2】:

如果我们谈论的是循环 build 依赖,那么当项目 A 依赖于项目 B 中的某些东西时,这就是问题所在,例如通过引用项目 B 中的一个类。同时项目 B 依赖于项目 A,因为它引用了项目 A 中的一个类或某些东西。这样做的问题是构建系统无法确定首先构建哪个项目,然后再构建哪个项目。

但是您发布的代码中有一种更奇怪的循环依赖。你的两个类的构造函数试图实例化另一个类,所以 A 实例化 B 实例化 A 实例化 B ......你明白了。

编辑:

循环build 依赖,至少对于我所知道的所有构建系统来说,100% 依赖于 projects 如何相互引用。根本不涉及 Visual Studio 解决方案,因此无论这两个项目是在同一个解决方案还是不同的解决方案中,或者甚至可能是不属于 Visual Studio 解决方案的项目,例如机器生成的项目,都没有关系。

如果您不使用自动构建系统,而是手动构建项目,那么就是构建系统。您将如何决定先构建哪个项目,然后再构建哪个项目?

【讨论】:

  • 感谢您的回答。实际上,我想从循环构建依赖和更常见的循环依赖的角度来回答。我还有一个问题要问你。正如我提到的 ProjectA 和 ProjectB 在不同的解决方案中,它仍然是循环构建依赖项吗?因为编译器不会一次构建 ProjectA 和 ProjectB 而是我需要自己构建它,因为它们不在同一个解决方案中。
【解决方案3】:

循环依赖在之间。这与项目和/或解决方案的组织无关。以下所有情况的问题都是相同的:

  1. 这些类位于不同解决方案的不同项目中。
  2. 类位于同一解决方案的不同项目中。
  3. 这些类在同一个解决方案的同一个项目中。
  4. 这些类在同一个解决方案中的同一个文件中。

循环依赖是一个编译错误,由于编译器对类型的处理方式无论它们位于何处,循环依赖仍然存在。

现在真正的问题是 - 为什么你有一个循环依赖(故意)?

【讨论】:

  • 实际上我和一个人就这个问题发生了争执,他告诉我,由于他们存在于不同的解决方案中,所以这不是循环依赖
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-07
  • 2018-04-26
  • 2020-01-02
  • 1970-01-01
  • 2019-12-03
相关资源
最近更新 更多