【问题标题】:C# - Circular Reference and cannot see NamespaceC# - 循环引用,看不到命名空间
【发布时间】:2009-06-02 12:08:55
【问题描述】:

我有一个包含 2 个项目的解决方案。

一个,Raven,是一个简单的基础,它为第二个项目 PPather 提供数据来做一些事情。第二个项目依赖于第一个编译所以要构建它,我添加了对 Raven 的引用。到目前为止一切正常。

现在我想让 Raven 启动 PPather。但它看不到 PPather naemspace,所以我看不到。解决此问题的所有努力都会导致循环引用错误。

有谁知道如何让 Raven 查看依赖它的 PPather 项目的命名空间?

【问题讨论】:

  • 如果它们相互依赖,为什么它们在单独的程序集中?
  • 您能否发布有关您的应用程序的更多信息,以便我们帮助您找出解决问题的更好方法?

标签: c# namespaces


【解决方案1】:

您不能 - 无法像您希望的那样以循环方式引用程序集。如果您需要创建循环引用,很可能您没有正确设计这些程序集。

您的第一个程序集是一个依赖项,因此其中不应该有任何代码知道 its 依赖项以外的任何内容。一旦您的程序集变得“智能”并开始了解它们自身依赖项之外的任何内容,您将开始遇到严重的维护和可伸缩性问题。我会考虑以您不需要创建循环引用的方式重新组织您的代码。

【讨论】:

  • 不能再同意了。听起来像一场噩梦。让我想起了 CMake 中的一个错误,它会导致循环依赖,因此 CMake 会陷入无限循环......
  • 看来我需要重新设计了。非常感谢您快速明确的答案!
  • 没问题 - 您是否可以发布更多详细信息,我们可以用来帮助您解决问题?
  • 其实这并不完全正确。您可以在 .NET 中创建循环引用,但它a:很难做到*,b:一个非常非常糟糕的主意。 *=例如,您不能在 IDE 中执行此操作 - 您必须转到命令行。很长一段时间以来,2 个核心 MS .NET 库都是循环的(我相信现在已修复)。
  • @Marc - 非常有趣 - 它是如何工作的?我很想知道。
【解决方案2】:

正如 Andrew 所说,你不能,而且你想要这样做也没有多大意义。

基本上,执行以下操作之一:

  • 合并程序集;如果它们真的相互依赖紧密,那么它们首先就不应该分开。

  • 重新设计程序集,使它们不会在两个方向上直接相互依赖;例如,使程序集 A 依赖于程序集 C 中定义的接口,并让程序集 B 实现该接口(两者都依赖于 C)。

【讨论】:

    【解决方案3】:

    如果您不愿意将它们组合成一个组件,您可以做很多事情来实现这一点。所有基本上都努力反转其中一个依赖项或创建两者都依赖的第三个组件。

    似乎 Raven 是起点,因此一种可能的解决方案是在 PPather 组件中创建一个基类或接口,以反映 PPather 在 Raven 中寻求的功能集。 Raven 然后可以实现这个基类,然后在实例化/调用 PPather 时包含一个“this”指针。 PPather 将期望在他自己的程序集中有一个指向基类(或接口)的指针,因此除非通过他自己的抽象,否则永远不会“知道”Raven。因此,循环依赖将被打破(通过依赖注入)。

    【讨论】:

      【解决方案4】:

      幸运的是,您不能添加循环引用 - 因为它们会导致维护噩梦。

      您希望 Raven 启动 PPather? PPather 是控制台/Windows 应用程序吗?使用 Process.Start 执行此操作(并将 PPather 的位置存储在注册表中的某个位置)。

      或者为您需要的 PPather 类创建接口 - 并使 PPather 中的类实现这些接口。

      interface IPPatherInterface // Inside of Raven.
      {
          void Foo();
      }
      
      class PPatherClass : IPPatherInterface // Inside of PPather
      {
          // ...
      }
      
      class SomeRavenClass // Static maybe? Inside of Raven
      {
          void SupplyPPatherClass(IPPatherInterface item) { ... }
      }
      

      您现在可以让 PPather 将该接口的实现提供给 Raven。

      【讨论】:

        【解决方案5】:

        将 Panther 需要使用的 raven 类从 raven 分支到不同的程序集,并让 panther 和 Raven 引用它们。

        虽然说实话,如果 Raven 需要运行 panther,那么我认为你的设计有点不对劲。你应该把你的代码分解成更易于管理的东西。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-01-23
          • 2010-12-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多