Implementieren von MVC mit Windows Forms

102

Wo finde ich ein gutes Beispiel für die vollständige Implementierung des MVC-Musters in Windows Forms?

Ich habe viele Tutorials und Codebeispiele auf verschiedenen Websites gefunden (z. B. The Code Project und .NetHeaven), aber viele sind repräsentativer für das Beobachtermuster als MVC. Da die Anwendung, die ich entwickeln möchte, für ein Schulprojekt bestimmt ist, zögere ich, Frameworks wie PureMVC oder MVC # zu verwenden .

kjv
quelle

Antworten:

115

Ich bin der Ansicht, dass Bewerbungen so unterschiedlich sind und dass unser Verständnis, wie Bewerbungen geschrieben werden sollten, immer noch sehr begrenzt ist. Frühere Windows Forms-Anwendungen, an denen ich gearbeitet habe, waren so unterschiedlich voneinander. Einige der Designunterschiede, die ich gesehen habe, sind (einschließlich der meisten Kombinationen):

  • Sprechen Sie direkt mit der Datenbank (2 Ebenen)
  • Verwenden Sie ein Backend, das für die jeweilige Anwendung geschrieben wurde (3 Ebenen).
  • Verwenden Sie eine Reihe von Webdiensten, die für die Verwendung durch viele Anwendungen geschrieben wurden und für Ihre Anwendung nicht geändert werden können. (Serviceorientierte Architektur)
  • Aktualisierungen werden durch CRUD- Operationen durchgeführt
  • Aktualisierungen werden mit dem Befehlsmuster durchgeführt (Senden von Befehlen an den Back-End-Server)
  • Viele Verwendungen der Datenbindung / keine Verwendungen der Datenbindung
  • Die meisten Daten sind "tabellenartig" (z. B. Rechnungen), die in Standard-Rastersteuerelementen gut funktionieren / für die meisten Benutzeroberflächendaten benutzerdefinierte Steuerelemente benötigen.
  • Ein Entwickler / Team von 10 oder 20 Entwicklern (nur auf der Benutzeroberfläche)
  • Viele Unit-Tests mit Mocks usw. / keine Unit-Tests

Daher denke ich nicht, dass es möglich ist, eine Implementierung von MVC (oder MVP) zu erstellen, die immer gut passt.

Die besten Beiträge, die ich gesehen habe , um MVC wirklich zu erklären und warum ein MVC-System so aufgebaut ist, wie es ist, sind die "Build Your Own CAB" -Serien von Jeremy D Miller . Nachdem Sie daran gearbeitet haben, sollten Sie in der Lage sein, Ihre Optionen viel besser zu verstehen. Die Smart Client Guidance von Microsoft (CAB / Microsoft Composite Application Block) sollte ebenfalls berücksichtigt werden. Es ist ein bisschen komplex, aber es kann gut für Anwendungen funktionieren, die eine gute Passform haben.

Durch Auswahl einer MVC / MVP-Implementierung für ein Winforms-Projekt erhalten Sie einen lesenswerten Überblick. Viele Leute mögen PureMVC . Ich habe es noch nie benutzt, aber ich würde es mir ansehen, wenn ich das nächste Mal ein MVC-Framework benötige.

" Presenter First " ist ein Softwareentwicklungsansatz, der die Ideen des MVP-Entwurfsmusters (Model View Presenter) und der testgetriebenen Entwicklung kombiniert . Sie können damit beginnen, Tests in der Sprache des Kunden zu schreiben. Beispielsweise:

"Wenn ich auf die Schaltfläche 'Speichern' klicke, sollte die Datei gespeichert werden und die Warnung zu nicht gespeicherten Dateien sollte verschwinden."

Ich habe keine Erfahrung mit "Presenter First", aber ich werde es versuchen, wenn ich die Gelegenheit dazu bekomme, da es sehr vielversprechend aussieht.

Weitere Fragen zum Stapelüberlauf, die Sie möglicherweise prüfen möchten, finden Sie hier und hier .

Wenn Sie zu irgendeinem Zeitpunkt WPF verwenden möchten , sehen Sie sich das MVVM- Muster (Model-View ViewModel) an . Hier ist ein sehr gutes Video, das Sie sich ansehen sollten: Jason Dolinger auf Model-View-ViewModel .

Das MVVM-Entwurfsmuster (Model View View Model) für Winforms bietet eine weitere Option, die die Konvertierung in WPF bei Bedarf vereinfacht. Magical.Trevor ist ein weiteres MVVM-Beispiel für Windows Forms, das auch die automatische Bindung basierend auf Eigenschaftsnamen enthält.


Fragen Sie sich auch, warum Sie MVC verwenden.

  • Möchten Sie in der Lage sein, so viel Code wie möglich zu testen?
  • Versuchen Sie, so viel Code wie möglich wiederzuverwenden?
  • Versuchen Sie, Ihre Codebasis leicht verständlich zu machen?
  • 101 andere Gründe, die für ein bestimmtes Projekt gültig sein können.

Sobald Sie Ihre Ziele klar definiert haben , wird es einfacher, die eine oder andere Implementierung auszuwählen.

Ian Ringrose
quelle
@AgnelKurian, das CAB war eine Reihe von Beispielcodes von Microsoft zum Erstellen von Apps - es ist jetzt größtenteils Geschichte.
Ian Ringrose
Haha! Ja, ich erinnere mich jetzt an diese "Anwendungsblöcke".
Agnel Kurian
45

UPDATE: Zusätzlich zu meiner vorherigen Antwort unten empfehle ich, über den "Presenter First" -Ansatz (insbesondere die PDF-Artikel) zu lesen.

Ich würde MVP (eigentlich PassiveView-Muster) anstelle von MVC empfehlen. Sie brauchen dafür keine speziellen Frameworks, sondern nur, wie Sie Ihren Code organisieren.

Ein Ansatz (den ich normalerweise verfolge) besteht darin, jedes Fensterformular in drei Einheiten aufzuteilen:

  1. Eine Presenter / Controller-Klasse - damit beginnen Sie tatsächlich bei der Entwicklung eines Formulars. Hier sollte sich der größte Teil Ihrer "Geschäfts" -Logik befinden.
  2. Eine Ansichtsschnittstelle (IView), die die Methoden, Eigenschaften und Ereignisse enthält. Diese Oberfläche ist alles , was der Präsentator über Ihr Formular weiß.
  3. Am Ende, wenn Sie die Implementierung des Präsentators und der Ansicht (einschließlich Komponententests) abgeschlossen haben, können Sie die eigentliche Formularklasse erstellen und die IView-Schnittstelle implementieren. Dann geht es nur noch darum, dem Formular geeignete Steuerelemente hinzuzufügen und diese mit der Schnittstelle zu verbinden.

Beispielcode (ein einfacher Pseudocode, nur zur Veranschaulichung):

interface IView
{
    string Username { get; set; }
    string Password { get; set; }

    event EventHandler LogOnButtonClicked;

    void InformUserLogOnFailed();
    void MoveToMainScreen();
}

class Presenter
{
    public Presenter(IView view)
    {
        this.view = view;
        view.LogOnButtonClicked += new EventHandler(OnLogOnButton);
    }

    private void OnLogOnButton()
    {
        // we ask some service to verify the username/password
        bool isLogOnOk = logOnService.IsUserAndPasswordOk(view.Username, view.Password);
        if (isLogOnOk)
            view.MoveToMainScreen();
        else
        {
            view.Username = "";
            view.Password = "";
            view.InformUserLogOnFailed();
        }
    }

    private IView view;
}

class Form : IView
{
    public Form()
    {
        presenter = new Presenter(this);
    }

    public string Username
    {
        get { return TextBoxUsername.Text; }
        set { TextBoxUsername.Text = value; }
    }

    public string Password
    {
        get { return TextBoxPassword.Text; }
        set { TextBoxPassword.Text = value; }
    }

    public void InformUserLogOnFailed()
    {
        MessageBox.Show("Invalid username or password.");
    }

    public void MoveToMainScreen()
    {
        // code for opening another form...
    }

    private Presenter presenter;
}
Igor Brejc
quelle
7
Dies ist eine Implementierung der MVP-Variante PassiveView. In der passiven Ansicht sollte die Ansicht seinen Moderator nicht auswählen. Für ein ähnliches Beispiel (aber mit einer WIRKLICH passiven Ansicht) überprüfen Sie dieses Beispiel danieleteti.it/?p=221 (Beispiel in Delphi-Sprache)
Daniele Teti
6

Haben Sie sich PureMVC angesehen ? Ich habe festgestellt, dass sich niemand darauf einigen kann, wie MVC wirklich aussieht, wenn sie mit dem Aufbau einer bestimmten Implementierung beginnen.

Update: Sie können Ihre eigenen erstellen, beginnend mit etwas Einfacherem wie MobileMVC . Compact Framework-Code sollte unter Windows kompiliert / ausgeführt werden. Da dies eine Schulaufgabe ist, würde ich vorschlagen, dass Sie tatsächlich einige Zeit damit verbringen, zu lernen, wie MVC tatsächlich funktioniert.

Brian Lyttle
quelle
Ich habe eine Schulaufgabe für eine sehr einfache Anwendung zur Verwaltung eines Buchladens, und ich bin ziemlich zurückhaltend bei der Verwendung eines Frameworks wie PureMVC. Ich suche etwas Einfacheres.
kjv
3

Vielleicht möchten Sie einen Blick auf Differential Execution werfen .

Hier ist es in SourceForge

IMO, es ist eine enorme Verbesserung gegenüber MVC, obwohl es immer noch ziemlich ungewöhnlich ist.

Mike Dunlavey
quelle
2

Ein gutes Beispiel für die Einführung Ihrer eigenen MVC-Implementierung mit Windows Forms finden Sie hier . Quellcode ist enthalten.

Wenn Sie Code für diese Aufgabe lesen, studieren und schreiben, werden Sie feststellen, dass es viele Meinungsverschiedenheiten darüber gibt, wie MVC implementiert werden sollte. Dies ist ein einfacher Fall, der die Trennung von Bedenken widerspiegelt und ein gutes Beispiel für die „Installation“ darstellt, die erforderlich ist, um dies anzuschließen.

Wenn Sie nicht zur Schule gehen, möchten Sie wahrscheinlich auf ein Framework zurückgreifen, wie es die anderen Poster empfohlen haben.

Gary.Ray
quelle
2

Der Microsoft Composite Interface Application-Block begann sein Leben als MVC-Implementierung (unter anderem durch implementierte Muster). Die Release-Version entwickelte sich jedoch zu einer MVP-Implementierung, die als eine Art andere Interpretation des MVC-Konzepts angesehen werden kann.

Wenn Sie bereit sind, den Code einer sehr vollständigen (und irgendwie komplexen) MVP-Implementierung zu überprüfen, finden Sie das MS-CAB als eine der Komponenten von Microsoft Smart Client Software Factory. Es kommt mit Quellcode. Sie finden es hier . Viel Glück!

Rui Craveiro
quelle