it-swarm.com.de

Wie würden Sie MVC in einer Windows Forms-Anwendung implementieren?

Ich entwickle nicht zu viele Desktop-/Windows Forms-Anwendungen, aber mir ist der Gedanke gekommen, dass die Verwendung des MVC-Musters (Model View Controller) für die Entwicklung von Windows Forms .NET von Nutzen sein kann.

Hat jemand MVC in Windows Forms implementiert? Wenn ja, haben Sie Tipps zum Design?

64

Was ich in der Vergangenheit getan habe, ist etwas Ähnliches zu benutzen, Model-View-Presenter .

[HINWEIS: Dieser Artikel war früher im Internet verfügbar. Um es jetzt zu sehen, müssen Sie das CHM herunterladen, die Dateieigenschaften anzeigen und auf Blockierung aufheben klicken. Dann können Sie das CHM öffnen und den Artikel finden. Vielen Dank, Microsoft! seufz]

Das Formular ist die Ansicht, und ich habe eine IView-Oberfläche dafür. Die gesamte Verarbeitung findet im Presenter statt, der nur eine Klasse ist. Das Formular erstellt einen neuen Präsentator und übergibt sich selbst als IView des Präsentators. Auf diese Weise können Sie zu Testzwecken stattdessen eine gefälschte IView übergeben und dann Befehle vom Präsentator an diese senden und die Ergebnisse erkennen.

Wenn ich einen vollwertigen Model-View-Controller verwenden würde, würde ich das wohl so machen:

  • Das Formular ist die Ansicht . Es sendet Befehle an das Modell, löst Ereignisse aus, die der Controller abonnieren kann, und abonniert Ereignisse aus dem Modell.
  • Der Controller ist eine Klasse, die die Ereignisse der Ansicht abonniert und Befehle an die Ansicht und das Modell sendet.
  • Das Modell löst Ereignisse aus, die von der Ansicht abonniert werden.

Dies würde zu dem klassischen MVC-Diagramm passen. Der größte Nachteil ist, dass es bei Ereignissen schwierig sein kann zu sagen, wer was abonniert. Das MVP-Muster verwendet Methoden anstelle von Ereignissen (zumindest so, wie ich es implementiert habe). Wenn das Formular/die Ansicht ein Ereignis auslöst (z. B. someButton.Click), ruft das Formular einfach eine Methode für den Präsentator auf, um die Logik dafür auszuführen. Die Ansicht und das Modell haben überhaupt keine direkte Verbindung. Beide müssen den Moderator durchlaufen.

40
Ryan Lundy

Nun, tatsächlich implementiert Windows Forms eine "Free-Style" -Version von MVC, ähnlich wie einige Filme eine beschissene "Free-Style" -Interpretation einiger klassischer Bücher implementieren (Romeo & Julia fallen mir ein).

Ich sage nicht, dass die Implementierung von Windows Forms schlecht ist, es ist nur ... anders.

Wenn Sie Windows Forms und die richtigen OOP Techniken und möglicherweise ein ORM wie EntitySpaces für Ihren Datenbankzugriff verwenden, können Sie Folgendes sagen:

  1. Die ORM/OOP-Infrastruktur ist das Modell
  2. Die Formulare sind die Ansichten
  3. Die Ereignishandler sind der Controller

Obwohl die Darstellung von View und Controller durch dasselbe Objekt die Trennung von Code und Darstellung erheblich erschwert (es gibt keine einfache Möglichkeit, eine "GTK + -Ansicht" in eine von Microsoft.Windows.Forms.Form abgeleitete Klasse einzufügen).

Was Sie tun können, wenn Sie vorsichtig genug sind. Halten Sie Ihren Formularcode vollständig von Ihrem Controller-/Modellcode getrennt, indem Sie nur GUI-bezogene Inhalte in die Ereignisbehandlungsroutinen und alle anderen Geschäftslogiken in eine separate Klasse schreiben. In diesem Fall müssten Sie nur den GUI-Code neu schreiben, wenn Sie jemals GTK + zum Schreiben einer anderen Ansichtsebene verwenden wollten.

19
dguaraglia

Windows Forms wurde nicht von Grund auf für die Verwendung von MVC entwickelt. Sie haben zwei Möglichkeiten.

Zunächst können Sie Ihre eigene Implementierung von MVC rollen.

Zweitens können Sie ein MVC-Framework verwenden, das für Windows Forms entwickelt wurde.

Das erste ist einfach zu tun, aber je weiter Sie kommen, desto komplexer wird es. Ich würde vorschlagen, nach einem guten, bereits vorhandenen und erprobten MVC-Framework zu suchen, das für Windows Forms entwickelt wurde. Ich glaube dieser Blog-Beitrag ist ein anständiger Ausgangspunkt.

Für Anfänger würde ich empfehlen, Windows Forms zu überspringen und gegen WPF zu entwickeln, wenn Sie die Option haben. Es ist ein viel besserer Rahmen für die Erstellung der Benutzeroberfläche. Es werden viele MVC-Frameworks für WPF entwickelt, einschließlich dieses und dieses .

17
Will

Laut Microsoft wird der von @jasonbunting erwähnte UIP-Anwendungsblock "archiviert". Schauen Sie sich stattdessen den Smart Client Application Block oder den noch neueren Smart Client Software Factory an, der sowohl WinForms als auch WPF SmartParts unterstützt.

4
aridlehoover

Checken Sie in den Anwendungsblock User Interface Process (UIP) ein. Ich weiß nicht viel darüber, habe es mir aber vor ein paar Jahren angeschaut. Möglicherweise gibt es neuere Versionen.

"Der UIP-Anwendungsblock basiert auf dem MVC-Muster (Model-View-Controller)."

2
Jason Bunting

Schauen Sie sich den MS Patterns and Practices Smart Client-Anwendungsblock an, der einige Anleitungen und Klassen enthält, die Sie durch die Implementierung eines Modellansicht-Präsentationsmusters in Windows-Formularen führen. Schauen Sie sich die enthaltene Referenzanwendung an.

Für WPF wird dies durch das Projekt Prisma ersetzt

Der Ansatz der Softwarefabriken ist eine hervorragende Möglichkeit, bewährte Methoden zu erlernen

1
Richard