C# - 循环引用,无法看到命名空间

时间:2009-06-02 12:08:55

标签: c# namespaces

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

其中一个是Raven,它是一个简单的基础,为第二个项目PPather提供数据。第二个项目依赖于第一个编译所以构建它,我添加了对Raven的引用。到目前为止一切运作良好。

现在我希望Raven推出PPather。但它看不到PPather naemspace所以我不能。所有解决此问题的努力都会导致循环引用错误。

任何人都知道如何让Raven看到依赖它的PPather项目的命名空间?

5 个答案:

答案 0 :(得分:13)

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

你的第一个程序集是一个依赖项,所以不应该有任何代码知道依赖项以外的任何代码。一旦您的程序集变得“聪明”并开始了解其自身依赖项之外的任何内容,您将开始出现严重的维护和可伸缩性问题。我会考虑重新组织您的代码,使您不需要创建循环引用。

答案 1 :(得分:2)

正如安德鲁所说,你不能,而且你想要的也没那么有意义。

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

  • 合并组件;如果他们真的相互依赖,那么他们真的不应该首先分开。

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

你想让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。

答案 4 :(得分:0)

将乌鸦需要从乌鸦使用到不同的装配体中的乌鸦中的calsses,并让黑豹和Raven引用它们。

虽然说实话,如果Raven需要跑豹,那么我认为你的设计有点偏。你应该把你的代码分解成更容易管理的东西。