Estoy usando el patrón Model View Presenter (MVP) como se describe en el documento The Humble Dialog Box (pdf) con un proyecto de MFC. Estoy seguro de que el problema es el mismo con la mayoría de los kits de herramientas GUI.
Lo que me molesta es la vista concreta (es decir, la clase de diálogo) está creando no solo el presentador sino también los servicios que el presentador necesita. ¿Eso es normal? ¿Por qué la vista necesita saber qué servicios necesita el presentador? Lo que estoy pensando es que debería inyectar dependencia al presentador en la clase de diálogo.
El control principal para la aplicación es una clase derivada de CWinApp. Entonces, ¿debería construir servicios y presentador en esta clase y luego inyectarlos en la clase de diálogo?
Aunque, ¿cómo inyectaría la dependencia al presentador en la clase de diálogo cuando el presentador necesita una referencia a la clase de vista en su constructor?
MyPresenter(IView *view, MyService *service);
Además, ¿qué tal si la ventana principal se genera en una ventana emergente, dónde se deben construir los detalles para ese presentador de ventanas y servicios?
Como se trata de C ++, no creo que me interese ningún tipo de marco DI.
ACTUALIZAR
Una idea que tuve fue construir el presentador con una vista nula, el constructor inyectó el presentador en la clase de diálogo, y luego en el constructor de la clase de diálogo llamar a un SetView(IView *view)
método en el presentador con this
dónde this
sería la clase de diálogo (que se deriva de IView ) Entonces:
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);
}
Parece un poco torpe pero mantiene la construcción del servicio fuera de la clase Dialog. La vista nula parece un poco peligrosa. Una alternativa sería construir una clase NullView que tuviera cuerpos de método vacíos y luego pasarla al constructor del presentador.