7

我有两个程序集 A 和 B。

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

一点细节:

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

我面临的两个问题:

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

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

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

4

5 回答 5

3

听起来您正在通过界面尝试死亡。并非所有内容都必须通过接口公开。

一个简单的答案是合并程序集,或者将公共控件和数据类型移动到第三个程序集。如果您想要一种一致的合同方式来访问或使用事物,并且您想隐藏实际的实现,您只需要接口事物。

于 2010-08-17T10:05:11.247 回答
3

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

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

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

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

于 2013-06-04T14:56:18.617 回答
1

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

其次,您可以通过实现工厂设计模式来做到这一点。

于 2010-08-17T09:59:56.833 回答
0

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

于 2010-08-17T09:58:47.703 回答
0

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

于 2010-08-17T10:07:15.130 回答