Autofac和WinForms集成问题
我有一个非常简单的WinForms POC利用Autofac和MVP模式。 在此POC中,我通过Autofac的Resolve方法从父窗体打开子窗体。 我遇到的问题是孩子的形式如何保持开放。 在子窗体的Display()
方法中,如果我调用ShowDialog()
则子窗体保持打开状态直到关闭它。 如果我打电话给Show()
,那么子表单会闪烁并立即关闭 - 这显然不好。
我已经完成了将Autofac集成到WinForms应用程序的大量搜索,但是在Autofac / WinForms集成中我没有找到任何好的例子。
我的问题是:
下面仅显示相关的代码。
谢谢,
凯尔
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
}
看看这段代码:
using(ILifetimeScope scope = container.BeginLifetimeScope())
{
scope.Resolve<ChildPresenter>().DisplayView(); //Display the child form
}
首先,你使用了一个孩子的生命周期范围是很好的。 如果您解决了顶级容器之外的问题,那么这些对象将与该容器(通常是应用程序的整个生命周期)一样长。
但是,这里有一个问题。 当DisplayView
调用Form.Show
,它立即返回。 using
块结束,子范围被放置,并且其所有对象(包括视图)也被处置。
在这种情况下,你不需要using
声明。 你想要做的是将子生命周期范围绑定到视图,以便在视图关闭时处理子范围。 有关示例,请参阅我的其他答案之一中的FormFactory
。 还有其他一些方法可以将此想法应用于您的架构 - 例如,您可以在注册(ContainerBuilder)中执行此操作。