Ich verwende das Model View Presenter (MVP) -Muster, wie in The Humble Dialog Box (pdf) beschrieben, mit einem MFC-Projekt. Ich bin sicher, dass das Problem bei den meisten GUI-Toolkits dasselbe ist.
Was mich stört, ist die konkrete Sichtweise (dh die Dialogklasse), die nicht nur den Präsentator erstellt, sondern auch die Dienste, die der Präsentator benötigt. Ist das normal? Warum muss die Ansicht wissen, welche Dienste der Präsentator benötigt? Was ich denke ist, dass ich den Präsentator abhängig in die Dialogklasse einfügen sollte.
Das Hauptsteuerelement für die Anwendung ist eine von CWinApp abgeleitete Klasse. Soll ich also Dienste und Präsentatoren in dieser Klasse erstellen und sie dann in die Dialogklasse einfügen?
Wie würde ich den Präsentator in Abhängigkeit in die Dialogklasse einfügen, wenn der Präsentator einen Verweis auf die Ansichtsklasse in seinem Konstruktor benötigt?
MyPresenter(IView *view, MyService *service);
Wie wäre es auch, wenn das Hauptfenster aus einem Popup-Fenster hervorgeht. Wo sollten die Details für diesen Windows-Präsentator und die Windows-Dienste erstellt werden?
Da dies C ++ ist, glaube ich nicht, dass ich an irgendeiner Art von DI-Framework interessiert wäre.
AKTUALISIEREN
Eine Idee , die ich hatte , war der Moderator mit einem Null - Ansicht, Konstruktor inject Präsentator in die Dialogklasse zu konstruieren, und dann in den Konstruktor des Dialogklasse aufrufen eine SetView(IView *view)
Methode auf dem Moderator mit this
dem this
der Dialog - Klasse sein würde (das ergibt sich aus IView ). Damit:
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);
}
Scheint ein wenig klobig, hält aber die Servicekonstruktion von der Dialog-Klasse fern. Die Nullansicht scheint ein wenig gefährlich. Eine Alternative wäre, tatsächlich eine NullView-Klasse mit leeren Methodenkörpern zu erstellen und diese dann an den Presenter-Konstruktor zu übergeben.