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 ...