Sto utilizzando lo schema Model View Presenter (MVP) come descritto in il documento Humble Dialog Box (pdf) con un progetto MFC. Sono sicuro che il problema è lo stesso con la maggior parte dei toolkit della GUI.
La cosa che mi dà fastidio è la visione concreta (cioè la classe di dialogo) che sta creando non solo il presentatore ma anche i servizi di cui il presentatore ha bisogno. È normale? Perché la vista deve sapere di quali servizi ha bisogno il relatore? Quello che sto pensando è che dovrei dipendere dal relatore nella classe di dialogo.
Il controllo principale dell'applicazione è una classe derivata da CWinApp. Quindi dovrei costruire servizi e relatori in questa classe e poi inserirli nella classe di dialogo?
Sebbene in che modo dovrei iniettare il relatore nella classe di dialogo quando il relatore ha bisogno di un riferimento alla classe di visualizzazione nel suo costruttore?
MyPresenter(IView *view, MyService *service);
Inoltre, se la finestra principale si aprisse da una finestra popup, dove dovrebbero essere costruiti i dettagli per il presentatore ei servizi di Windows?
Poiché questo è C ++, non penso che sarei interessato a nessun tipo di framework DI.
Aggiorna
Un'idea che avevo era di costruire il presentatore con una vista nulla, il costruttore inietta il presentatore nella classe di dialogo, e poi nel costruttore della classe di dialogo chiama un metodo SetView(IView *view)
sul presentatore con this
dove this
sarebbe la classe di dialogo (che deriva da IView). Quindi:
MyApp::Start()
{
SomeService *service = new SomeService();
MyPresenter *presenter = new MyPresenter(null, service);
MyDialog *dialog = new MyDialog(presenter);
...
}
MyDialog::MyDialog(MyPresenter *presenter):
presenter_(presenter)
{
presenter_->SetView(this);
}
Sembra un po 'cauto ma mantiene la costruzione del servizio fuori dalla classe Dialog. La visualizzazione nulla sembra un po 'pericolosa. Un'alternativa sarebbe quella di costruire effettivamente una classe NullView con corpi di metodo vuoti e quindi passarla nel costruttore di presenter.