Where and how to reference composite MVP components?

Posted by Lea Hayes on Programmers See other posts from Programmers or by Lea Hayes
Published on 2014-07-14T05:18:26Z Indexed on 2014/08/20 4:29 UTC
Read the original article Hit count: 401

Filed under:
|
|
|
|

I am learning about the MVP (Model-View-Presenter) Passive View flavour of MVC. I intend to expose events from view interfaces rather than using the observer pattern to remove explicit coupling with presenter.

Context: Windows Forms / Client-Side JavaScript.

I am led to believe that the MVP (or indeed MVC in general) pattern can be applied at various levels of a user interface ranging from the main "Window" to an embedded "Text Field". For instance, the model to the text field is probably just a string whereas the model to the "Window" contains application specific view state (like a persons name which resides within the contained text field).

Given a more complex scenario:

  • Documentation viewer which contains:
    • TOC navigation pane
    • Document view
    • Search pane

Since each of these 4 user interface items are complex and can be reused elsewhere it makes sense to design these using MVP.

Given that each of these user interface items comprises of 3 components; which component should be nested? where? who instantiates them?

Idea #1 - Embed View inside View from Parent View

public class DocumentationViewer : Form, IDocumentationViewerView {
    public DocumentationViewer() {
        ...

        // Unclear as to how model and presenter are injected...
        TocPane = new TocPaneView();
    }
    protected ITocPaneView TocPane { get; private set; }
}

Idea #2 - Embed Presenter inside View from Parent View

public class DocumentationViewer : Form, IDocumentationViewerView {
    public DocumentationViewer() {
        ...

        // This doesn't seem like view logic...
        var tocPaneModel = new TocPaneModel();
        var tocPaneView = new TocPaneView();
        TocPane = new TocPanePresenter(tocPaneModel, tocPaneView);
    }
    protected TocPanePresenter TocPane { get; private set; }
}

Idea #3 - Embed View inside View from Parent Presenter

public class DocumentationViewer : Form, IDocumentationViewerView {
    ...

    // Part of IDocumentationViewerView:
    public ITocPaneView TocPane { get; set; }
}

public class DocumentationViewerPresenter {
    public DocumentationViewerPresenter(DocumentationViewerModel model, IDocumentationViewerView view) {
        ...

        var tocPaneView = new TocPaneView();
        var tocPaneModel = new TocPaneModel(model.Toc);
        var tocPanePresenter = new TocPanePresenter(tocPaneModel, tocPaneView);
        view.TocPane = tocPaneView;
    }
}

Some better idea...

© Programmers or respective owner

Related posts about design-patterns

Related posts about mvc