Estou usando o padrão Model View Presenter (MVP), conforme descrito no artigo The Humble Dialog Box (pdf) com um projeto MFC. Tenho certeza de que o problema é o mesmo com a maioria dos kits de ferramentas da GUI.
O que está me incomodando é a visão concreta (ou seja, a classe de diálogo) está criando não apenas o apresentador, mas também os serviços que o apresentador precisa. Isso é normal? Por que a exibição precisa saber de quais serviços o apresentador precisa? O que estou pensando é que eu deveria injetar dependência no apresentador na classe de diálogo.
O controle principal do aplicativo é uma classe derivada do CWinApp. Então, devo construir serviços e apresentador nesta classe e injetá-los na classe dialog?
Embora como a dependência injetasse o apresentador na classe de diálogo quando o apresentador precisa de uma referência à classe de exibição em seu construtor?
MyPresenter(IView *view, MyService *service);
E se a janela principal aparecer em uma janela pop-up, onde os detalhes desse apresentador e serviços do Windows devem ser construídos?
Como este é C ++, acho que não estaria interessado em nenhum tipo de estrutura de DI.
ATUALIZAR
Uma idéia que tive foi construir o apresentador com uma visão nula, o construtor injeta o apresentador na classe de diálogo e, em seguida, no construtor da classe de diálogo, chama um SetView(IView *view)
método no apresentador com this
onde this
seria a classe de diálogo (que deriva de IView ) Assim:
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 um pouco arrogante, mas mantém a construção de serviços fora da classe Dialog. A visão nula parece um pouco perigosa. Uma alternativa seria realmente construir uma classe NullView que tivesse corpos de métodos vazios e depois passar isso para o construtor do apresentador.