How should Application.Run() be called for the main presenter of a MVP WinForms app?

Posted by Mr Roys on Stack Overflow See other posts from Stack Overflow or by Mr Roys
Published on 2010-05-03T10:40:10Z Indexed on 2010/05/07 6:48 UTC
Read the original article Hit count: 303

Filed under:
|
|
|

I'm learning to apply MVP to a simple WinForms app (only one form) in C# and encountered an issue while creating the main presenter in static void Main(). Is it a good idea to expose a View from the Presenter in order to supply it as a parameter to Application.Run()?

Currently, I've implemented an approach which allows me to not expose the View as a property of Presenter:

    static void Main()
    {
        IView view = new View();
        Model model = new Model();
        Presenter presenter = new Presenter(view, model);
        presenter.Start();
        Application.Run();
    }

The Start and Stop methods in Presenter:

    public void Start()
    {
        view.Start();
    }

    public void Stop()
    {
        view.Stop();
    }

The Start and Stop methods in View (a Windows Form):

    public void Start()
    {
        this.Show();
    }

    public void Stop()
    {
        // only way to close a message loop called 
        // via Application.Run(); without a Form parameter
        Application.Exit();
    }

The Application.Exit() call seems like an inelegant way to close the Form (and the application). The other alternative would be to expose the View as a public property of the Presenter in order to call Application.Run() with a Form parameter.

    static void Main()
    {
        IView view = new View();
        Model model = new Model();
        Presenter presenter = new Presenter(view, model);
        Application.Run(presenter.View);
    }

The Start and Stop methods in Presenter remain the same. An additional property is added to return the View as a Form:

    public void Start()
    {
        view.Start();
    }

    public void Stop()
    {
        view.Stop();
    }

    // New property to return view as a Form for Application.Run(Form form);
    public System.Windows.Form View
    {
        get { return view as Form(); }
    }

The Start and Stop methods in View (a Windows Form) would then be written as below:

    public void Start()
    {
        this.Show();
    }

    public void Stop()
    {
        this.Close();
    }

Could anyone suggest which is the better approach and why? Or there even better ways to resolve this issue?

© Stack Overflow or respective owner

Related posts about mvp

Related posts about winforms