3

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

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

菜单在整个应用程序中通常具有相同的项目。因此,Assembly 1 和 Assembly 2 都相互引用以“新建”彼此的表格并显示它们。

关于大小的说明:我的应用程序是一个现有的应用程序,所以情况并不像上面两个组装的情况那么简单。但是,如果我可以简单地解决上述问题(可能不实现 a ,我可以将其应用于更大的应用程序(大约 20 个组件,所有组件都有几种跨组件相互弹出的表单)。

我已经考虑了一些解决方案,但它们似乎都很麻烦。我缺少一个简单的解决方案吗?

4

5 回答 5

4

您可以(在这两种情况下)使按钮简单地引发一个事件。shell exe 引用了这两个程序集,并连接了偶数以显示另一种形式。

所以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();
    }
}
于 2008-12-12T14:43:34.433 回答
2

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

于 2008-12-12T14:47:16.687 回答
1

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

于 2008-12-12T14:54:41.073 回答
0

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

于 2008-12-12T15:46:59.780 回答
0

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

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

谢谢。

于 2008-12-15T15:50:11.923 回答