Autofac和WinForms集成问题

我有一个非常简单的WinForms POC利用Autofac和MVP模式。 在此POC中,我通过Autofac的Resolve方法从父窗体打开子窗体。 我遇到的问题是孩子的形式如何保持开放。 在子窗体的Display()方法中,如果我调用ShowDialog()则子窗体保持打开状态直到关闭它。 如果我打电话给Show() ,那么子表单会闪烁并立即关闭 - 这显然不好。

我已经完成了将Autofac集成到WinForms应用程序的大量搜索,但是在Autofac / WinForms集成中我没有找到任何好的例子。

我的问题是:

  • 用我的方法显示非模态子窗体的正确方法是什么?
  • 在WinForms应用程序中使用Autofac的方法是否比我的方法更好?
  • 我如何确定没有内存泄漏,并且Autofac正在清理子窗体的Model / View / Presenter对象?
  • 下面仅显示相关的代码。

    谢谢,

    凯尔

    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)中执行此操作。

    链接地址: http://www.djcxy.com/p/29181.html

    上一篇: Autofac & WinForms Integration Issue

    下一篇: WPF User Control in WinFORMS: Project Structuring