Domanda

Sto cercando di creare una sorta di UI principale / di dettaglio usando un modello MVP. Ho i soliti sospetti:

interface IMainView{}
class MainView: Form, IMainView{}

interface IMainPresenter{}
class MainPresenter{}

// Numerous domain objects

Ho anche un UserControl che è anche una vista della sua triade MVP:

interface ISubView{}
class SubView: UserControl, ISubView{}

interface ISubPresenter{}
class SubPresenter{}

MainPresenter crea e un'istanza di SubPresenter, che a sua volta crea un'istanza di SubView. Il mio problema è che le viste non contengono riferimenti reciproci o sanno addirittura che esistono. Conoscono solo i loro relatori ma voglio associare una vista che è un UserControl a un'altra vista che è un modulo. È possibile farlo e mantenere l'ignoranza reciproca di ogni punto di vista?

Fino a questo punto tutte le viste hanno esposto le proprietà necessarie a ciascun relatore come tipi di sistema in modo che i presentatori non sarebbero interessati se un ListBox si trasformasse in un ComboBox o un RadioGroup. Mi piacerebbe mantenerlo in questo modo, se possibile, ma sono disposto a rompere questo schema se non ho altra scelta.

La mia ragione per farlo è che MainView presenta all'utente una raccolta di oggetti. Ogni oggetto può essere una delle diverse (più di 50) classi diverse. Tutti implementeranno un'interfaccia comune ma l'interfaccia utente per manipolare ciascun oggetto varierà con la classe sottostante.

A proposito, si tratta di un'applicazione Winforms destinata a .NET 2.0 (è compilata come C # 3.0)

È stato utile?

Soluzione

Ho risolto questo problema facendo in modo che il subpresenter passasse un riferimento alla sua vista al presentatore principale che poi lo passasse alla sua vista, che poi lo assegnasse a un pannello vuoto.

subView
  |
  V
subPresenter
  |
  V
mainPresenter
  |
  V
mainView

Viene passato come un semplice vecchio oggetto, quindi nessuno dei presentatori deve includere riferimenti allo spazio dei nomi di winforms. MainView presuppone semplicemente che sia un deceduto di UserControl e lo lancia come tale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top