Dove e come fare riferimento ai componenti compositi MVP?

-1

Sto imparando il sapore passivo di MVC (Model-View-Presenter). Intendo esporre gli eventi dalle interfacce di visualizzazione piuttosto che utilizzare il modello di osservatore per rimuovere l'accoppiamento esplicito con il presentatore.

Contesto: Windows Form / JavaScript sul lato client.

Sono portato a credere che il pattern MVP (o anche MVC in generale) possa essere applicato a vari livelli di un'interfaccia utente che va dalla "Finestra" principale a un "Campo di testo" incorporato. Ad esempio, il modello del campo di testo è probabilmente solo una stringa, mentre il modello della "Finestra" contiene uno stato di visualizzazione specifico dell'applicazione (come il nome di una persona che risiede nel campo di testo contenuto).

Dato uno scenario più complesso:

  • Visualizzatore della documentazione che contiene:
    • riquadro di navigazione TOC
    • Vista documento
    • Riquadro di ricerca

Poiché ciascuno di questi 4 elementi dell'interfaccia utente è complesso e può essere riutilizzato altrove, è logico progettarli utilizzando MVP.

Dato che ognuno di questi elementi dell'interfaccia utente comprende 3 componenti; quale componente dovrebbe essere annidato? dove? chi li istanzia?

Idea n. 1 - Incorpora vista all'interno della vista dalla vista principale

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 n. 2: Incorpora Presentatore all'interno della vista dalla visualizzazione principale

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 n. 3 - Incorpora la vista all'interno della vista dal genitore relatore

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;
    }
}

Qualche idea migliore ...

    
posta Lea Hayes 14.07.2014 - 07:18
fonte

2 risposte

0

Dopo un po 'di riflessione sembra che il seguente approccio potrebbe essere utile per cui ogni controllo interno è rappresentato da una facciata che costruisce il presentatore, la vista e il suo modello e espone i metodi rilevanti:

Mi piacerebbe sapere cosa pensano gli altri di questa idea ...

    
risposta data 21.07.2014 - 05:13
fonte
0

Non posso fare a meno di sentirti mancare una soluzione ovvia. Forse mi manca qualcosa qui, ma perché il tuo modulo non implementa tutte e tre le interfacce? Non vedo la necessità di cercare di mantenere trance delle opinioni all'interno di un'altra vista.

public class DocumentationViewer : 
    Form, IDocumentationViewerView, ITocPaneView, ISearchView {

    public DocumentationViewer() {
        var docPresenter = new DocumentPresenter(this);
        var tocPresenter = new TocPresenter(this);
        //...
    }
    
risposta data 15.08.2015 - 16:11
fonte

Leggi altre domande sui tag