我有一个使用 Autofac 和 MVP 模式的非常简单的 WinForms POC。在这个 POC 中,我通过 Autofac 的 Resolve 方法从父表单打开一个子表单。我遇到的问题是子表单如何保持打开状态。在Display()
子窗体的方法中,如果我调用ShowDialog()
子窗体保持打开状态,直到我关闭它。如果我调用Show()
,子窗体会闪烁并立即关闭 - 这显然不好。
我已经为将 Autofac 集成到 WinForms 应用程序进行了大量搜索,但是我没有找到任何关于 Autofac/WinForms 集成的好的示例。
我的问题是:
- 用我的方法显示非模态子表单的正确方法是什么?
- 有没有比我的方法更好的方法在 WinForms 应用程序中使用 Autofac?
- 如何确定没有内存泄漏以及 Autofac 是否正确清理子窗体的模型/视图/演示者对象?
下面仅显示相关代码。
谢谢,
凯尔
public class MainPresenter : IMainPresenter
{
ILifetimeScope container = null;
IView view = null;
public MainPresenter(ILifetimeScope container, IMainView view)
{
this.container = container;
this.view = view;
view.AddChild += new EventHandler(view_AddChild);
}
void view_AddChild(object sender, EventArgs e)
{
//Is this the correct way to display a form with Autofac?
using(ILifetimeScope scope = container.BeginLifetimeScope())
{
scope.Resolve<ChildPresenter>().DisplayView(); //Display the child form
}
}
#region Implementation of IPresenter
public IView View
{
get { return view; }
}
public void DisplayView()
{
view.Display();
}
#endregion
}
public class ChildPresenter : IPresenter
{
IView view = null;
public ChildPresenter(IView view)
{
this.view = view;
}
#region Implementation of IPresenter
public IView View
{
get { return view; }
}
public void DisplayView()
{
view.Display();
}
#endregion
}
public partial class ChildView : Form, IView
{
public ChildView()
{
InitializeComponent();
}
#region Implementation of IView
public void Display()
{
Show(); //<== BUG: Child form will only flash then instantly close.
ShowDialog(); //Child form will display correctly, but since this call is modal, the parent form can't be accessed
}
#endregion
}