【问题标题】:Adding this project will cause a circular dependency添加这个项目会导致循环依赖
【发布时间】:2014-03-03 15:22:04
【问题描述】:

我有一个由两个程序集组成的 WPF 应用程序。

Assembly A 是一个 wpf 应用程序。

Assembly B 是一个 3D 应用,带有一个主要由 A 使用的公共 API。

程序集 A 引用了程序集 B。

现在,当程序集 B 上触发事件时,我需要在静态类应用程序中调用程序集 A 中的方法。

如果我尝试在 B 中添加对程序集 A 的引用,则会出现错误:

添加这个项目会导致循环依赖

你对如何解决它有什么想法吗?

具体我想知道:

  • 如何从assembly B调用A中的App.myMethod()?
  • 为了解耦类,我可以在程序集 B 上触发一个通用事件并在程序集 A 上捕获它吗?
  • 欢迎任何其他想法。

【问题讨论】:

  • 事件是如何创建的?当您创建它作为初始化的一部分时,您可以将static class 传递到您的事件中吗?
  • 控制模式反转就是为了应对这种情况而设计的。
  • 我可以更改两个程序集的源代码。现在来自程序集 B 的事件处理程序是 private void OnTouchDownHandler(object sender, Windows7.Multitouch.TouchEventArgs e) { AddTouchDown(e.Id, e.Location); }
  • 您能否将静态方法移至 B 或 A 和 B 都引用的第三个程序集?
  • 感谢 juharr,有趣的方法,但我不能移动静态 B 也不能创建第三个程序集

标签: c# .net wpf .net-assembly


【解决方案1】:

如何从程序集 B 调用 A 中的 App.myMethod?

如果 A 依赖于 B,你就不能。

如果事件是从 B 中的某个类触发,您应该从 A 中的某个类订阅该事件:

A 中的代码:

var classB = new ClassB();  // presumably in your code in A somewhere
classB.MyEvent += new EventHandler(this.HandleEventFromB);


public void HandleEventFromB(object sneder, EventArgs args)
{
    ClassA.StaticMethod();
}

这样 B 不依赖于 A。

您可能需要将 B 中的事件“冒泡”到某个公开暴露的事件,以便从 A 订阅它。

【讨论】:

    【解决方案2】:

    如果您添加对已构建 DLL 的引用而不是项目,则可以添加它。

    【讨论】:

    • 你仍然有一个循环依赖,并且必须单独构建每个项目。
    • 项目仍然可以在同一个解决方案中同时构建,只是不能作为项目引用添加。它会像这样工作,它只是不是最优雅的解决方案。
    【解决方案3】:

    听起来像是设计问题。由于我不知道您的实施中的具体细节,请将以下内容作为指导/想法。

    当事件在 B 上触发时,我假设它会创建一些数据。如果您可以将此数据存储在数据库或类似数据库中,然后在应用程序 A 中可能有一个定时事件,该事件基本上会侦听此数据,然后根据需要提供更新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-26
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 2022-11-22
      • 1970-01-01
      • 2020-11-18
      相关资源
      最近更新 更多