循环参考

时间:2008-12-12 14:32:48

标签: .net winforms circular-dependency

我正在寻找一个好的模式来解决Windows窗体应用程序中的以下循环引用:

  • 程序集1包含一个带有Infragistics菜单项的Windows窗体“。显示在程序集2中的窗体”
  • 程序集2包含一个带有Infragistics菜单项的Windows窗体“。显示在程序集1中的窗体”

在整个应用程序中,菜单上通常包含相同的项目。因此,大会1和大会2都互相提及“新建”一个人的形式和。显示它们。

关于尺寸的说明:我的应用程序是一个现有的应用程序,因此情况并不像上面的两个装配情况那么简单。但是,如果我可以简单地解决上述问题(可能没有实现一个,我可以将它应用于更大的应用程序(大约20个组件,所有组件都有多个组件在组件之间相互弹出)。

我已经考虑了一些解决方案,但它们看起来都很麻烦。有一个我想念的简单解决方案吗?

5 个答案:

答案 0 :(得分:4)

你可以(在两种情况下)使按钮只是举起一个事件。 shell exe引用了两个程序集,并连接了even以显示另一个表单。

所以exe知道两者;这两种形式都不了解对方。

例如(相同的概念):

using System;
using System.Windows.Forms;
class Form1 : Form
{
    public event EventHandler Foo;
    public Form1()
    {
        Button btn = new Button();
        btn.Click += delegate { if(Foo!=null) Foo(this, EventArgs.Empty);};
        Controls.Add(btn);
    }
}
class Form2 : Form
{
    public event EventHandler Bar;
    public Form2()
    {
        Button btn = new Button();
        btn.Click += delegate { if (Bar!= null) Bar(this, EventArgs.Empty); };
        Controls.Add(btn);
    }
}
static class Program
{
    [STAThread]
    static void Main()
    {
        ShowForm1();
        Application.Run();
    }
    static void ShowForm1()
    {
        Form1 f1 = new Form1();
        f1.Foo += delegate { ShowForm2(); };
        f1.Show();
    }
    static void ShowForm2()
    {
        Form2 f2 = new Form2();
        f2.Bar += delegate { ShowForm1(); };
        f2.Show();
    }
}

答案 1 :(得分:2)

您是否考虑过创建第3个程序集并将所有常用代码移动到第3个程序集中?

答案 2 :(得分:1)

使用组件工厂或组件编写器(如MEF)创建实例,而不引用组件的源程序集。

答案 3 :(得分:0)

使用接口怎么样? 您可以构建包含接口的第三个库,每个窗口都实现一个接口,并引用另一个窗口的接口。

答案 4 :(得分:0)

此刻,我决定使用反射来弹出需要弹出的窗口。我不需要直接引用它们,我实际上可以更容易地添加组件,而无需创建所有交叉引用的程序集。

我看了MEF但不幸的是,我使用的是VS2003,而不是VS2008。这个建议让我走上了简单反思的道路。

感谢。