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

时间:2010-08-17 09:55:12

标签: c# circular-reference

我有两个组件A&乙

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

一些细节:

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

我面临的两个问题:

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

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

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

5 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

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

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

  1. 1>合并程序集(编译时间增加,可能不会 如果组件在功能上不相关,那就有意义了。 C#经常强迫你这样做,即使程序集在逻辑上应该是分开的。
  2. 依赖注入
  3. 使用模块引用的接口创建第三个程序集。这通过C#语言机制(接口)完成依赖注入,而不是自己滚动;但它是一样的。
  4. 3号通常是如何在C#中处理这些情况,但它不如C / C ++解决这个问题那么优雅。对于大型代码库,您必须从一开始就考虑到这一点。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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