两个.net程序集之间的循环引用

我有两个组件A和B.

A现有对B的引用,必须保持这种方式。 现在我对B进行了一些需要引用A的更改。因此发生了循环引用。

一点细节:

A有一些属性网格,需要托管B中的对话框。 因此,为了避免这个循环引用问题,我尝试在A&B都引用的第三个程序集中定义网格的接口,并且使B仅引用接口。

我面临的两个问题:

  1. 在A中定义的网格内部有太多自定义数据类型(特定属性),我必须为每个网格定义接口。

  2. 我看到这个例子与函数参数一起工作,例如通过传入的接口调用目标函数。但考虑到下面的代码,它将如何适合 – 我不能新建一个ICustomPropertyGridWrapper …

    object = new CustomPropertyGridWrapper(...)
    m_property.SelectedObject = object;

对于问题1,除了合并这两个项目或进行一些代码生成之外,还没有真正的解决方案

对于第二种,您可以通过实现Factory设计模式来实现。

听起来你正试图通过界面死亡。 并非一切都必须通过界面公开。

一个简单的答案是合并程序集,或将公共控件和数据类型移动到第三个程序集。 如果您希望以一致的合同方式访问或处理事物,并且希望隐藏实际实现,则只需要对接口进行操作。

这是C#语言设计的一个问题。 在C / C ++中,您只需使用标头来定义编译单元的接口,并解析依赖关系。

在C#中没有标题。 你有三个选择

  1. 1>合并程序集(编译时间增加,可能不会
    如果组件在function上不相关,那就有意义了。 C#经常强迫你这样做,即使程序集在逻辑上应该是分开的。
  2. dependency injection
  3. 使用模块引用的接口创建第三个程序集。 这通过C#语言机制(接口)完成dependency injection,而不是自己滚动; 但它是一回事。

3号通常是如何在C#中处理这些情况,但它不像C / C ++解决这个问题那样优雅。 对于大型代码库,您必须从一开始就考虑到这一点。

如果B现在依赖于A的位,也许你应该将这些位重构为一个新的程序集C,它将被A和B引用。

重构代码或合并程序集=不要使用循环引用。 这是非常糟糕的设计的症状。