我有两个组件A&乙
A现有对B的引用,必须保持这种方式。现在我对B进行了一些需要引用A的更改。因此发生循环引用。
一些细节:
A有一些属性网格,需要托管B中的对话框。因此,为了避免这个循环引用问题,我试图在第三个程序集中定义网格的接口,A& B都是引用,而B只是指接口。
我面临的两个问题:
在A内部定义的网格中有太多自定义数据类型(特定属性),我必须为每个网格定义接口。
我看到这个例子适用于函数参数,例如通过传入的接口调用目标函数。但考虑到下面的代码,它将如何适合 - 我不能新建一个ICustomPropertyGridWrapper ......
object = new CustomPropertyGridWrapper(...)
m_property.SelectedObject = object;
答案 0 :(得分:3)
听起来你正试图通过界面去世。并非一切都必须通过界面公开。
一个简单的答案是合并程序集,或将公共控件和数据类型移动到第三个程序集。如果您希望以一致的合同方式访问或处理事物,并且希望隐藏实际的实现,则只需要连接事物。
答案 1 :(得分:3)
这是C#语言设计的一个问题。在C / C ++中,您只需使用标头来定义编译单元的接口,并解析依赖关系。
在C#中没有标题。你有三个选择
3号通常是如何在C#中处理这些情况,但它不如C / C ++解决这个问题那么优雅。对于大型代码库,您必须从一开始就考虑到这一点。
答案 2 :(得分:1)
重构代码或合并程序集=不要使用循环引用。这是非常糟糕的设计症状。
答案 3 :(得分:1)
对于问题1,除了合并两个项目或进行一些代码生成之外,还没有真正的解决方案
对于第二个,您可以通过实现Factory设计模式来实现。
答案 4 :(得分:0)
如果B现在依赖于A的位,也许你应该将这些位重构为一个新的汇编C,它将被A和B引用。