webentwicklung-frage-antwort-db.com.de

Projektstruktur für MVVM in WPF

Wie sieht die Projektstruktur bei der Verwendung von MVVM in WPF aus?

Von den Tutorials, die ich jetzt gesehen habe, haben sie normalerweise Ordner: Model, ModelView und View.

In Model setzen Sie Klassen wie Person ein, die Daten und Logik erfassen.

In ModelView instanziieren Sie Klassen, die in Model definiert sind. Die Ansicht enthält .xaml-Dateien.

Bearbeiten: Ich bearbeite meinen ursprünglichen Beitrag, um eine Beispielprojektstruktur zu senden. Ich habe Fragen dazu. Wie organisiere ich diese: App.config App.xaml MainWindow.xaml

Soll ich sie draußen lassen, wie sie jetzt sind, oder soll ich sie in einen Ordner legen?

enter image description here

55
user2381422

Sie haben das übliche oder allgemeine Ordnerlayout beschrieben. Erfahrungsgemäß bevorzuge ich es, einen separaten Ordner (oder ein Projekt in großen Anwendungen) für den Modelldatentyp hinzuzufügen, z. B. die von Ihnen erwähnte typische Klasse Person. Der Grund, warum ich das tue, ist, dass dies oft zu einem der größten Projekte wird. Ich habe es auch in die folgenden Unterordner aufgeteilt:

DataTypes
    Collections
    Enums
    Interfaces

Ich habe auch separate Ordner (oder Projekte in großen Anwendungen) für die Anwendungsklassen Converter, Erweiterungsmethodenklassen, Dienstprogrammklassen (oder Dienstklassen). Schließlich habe ich Testprojekte, die ziemlich genau der Ordnerstruktur der Anwendung entsprechen. Insgesamt sehen meine Ordner ungefähr so ​​aus:

Solution

    Third Party Libraries <<< (Solution Folder)

    StartUp Project
        Images
        Resources

    Converters

    DataTypes
        Collections
        Enums
        Interfaces <<< (For Data Type classes)

    Extensions

    Models
        Data Controllers
        Data Providers
        Interfaces <<< (For swapping Model classes out in test projects)

    Utilities (Or Services)
        Interfaces <<< (For swapping Utilities classes out in test projects)

    View Models
        Commands

    Views
        Attached Properties
        Controls

UPDATE >>>

Projekte, wie Ordner, bieten nur Ebenen der Trennung. Sie helfen mir auch, meine Anwendungsnamespaces zuzuordnen. Beispielsweise befinden sich Code-Klassen im Ordner/Projekt Collections im Ordner ApplicationName.DataTypes.Collections Namespace. Klassen in der Data Providers Ordner/Projekt wird die ApplicationName.Models.DataProviders Namespace.

Darüber hinaus stammen meine Projektnamen in großen Anwendungen von ihrer Position in dieser Hierarchie. Beispielsweise heißt mein DataTypes -Projekt tatsächlich ApplicationName.DataTypes und mein Models Projekt heißt ApplicationName.Models. Die Teile Collections und DataProviders sind Ordner, zusammen mit allen Elementen nach der zweiten Ebene, z. Enums, Images, Commands usw.

60
Sheridan

Die meisten Leute verwenden die von Ihnen erwähnte "Standard" -Struktur:

  • Modell/
    • CarModel.cs
    • DriverModel.cs
  • ViewModel /
    • CarViewModel.cs
    • DriverViewModel.cs
  • Aussicht/
    • CarView.xaml
    • DriverView.xaml

Ich denke, der Grund, warum es beliebt ist, ist, dass einige Leute argumentieren, dass Sie in der Lage sein sollten, Modelle, Ansichtsmodelle und Ansichten in verschiedenen Baugruppen zu platzieren.

Mit dieser Struktur können Sie auch problemlos Ordner für andere WPF-Inhalte hinzufügen: Converters/, Resources/, etc.

In meinem Team verwenden wir diese Struktur, aber wir pluralisieren die Namen (also Models/ViewModels/Views).

In den meisten Fällen werden Modellklassen jedoch in anderen Assemblys/Namespaces definiert. In diesem Fall haben wir nicht einmal ein Models/ Mappe.

Für große Projekte fügen wir Unterordner in das Models/, ViewModels/ und Views/

Der Vollständigkeit halber ist es erwähnenswert, dass Sie möglicherweise einige Leute finden, die eine "funktionsgesteuerte" Struktur verwenden:

  • Wagen/
    • CarModel.cs
    • CarViewModel.cs
    • CarView.xaml
  • Treiber/
    • DriverModel.cs
    • DriverViewModel.cs
    • DriverView.xaml

Aber es ist sehr ungewöhnlich.

22
Benoit Blanchon

Was ich normalerweise habe, geht so:

  • Hauptanwendung (.exe) - Globale Stile usw
  • Common Lib WPF - Basisklassen und Helfer für WPF
  • Common Lib General - Basisklassen und Helfer für Modelle
  • Infrastruktur - Abhängigkeitsinjektion, Protokollierung usw
  • Schnittstellen für VM
  • Schnittstellen für M
  • Es sind auch mehrere Bibliotheken mit Views und entsprechenden ViewModels - Splitting möglich
  • Mehrere Bibliotheken mit Modellen

Alle Abhängigkeiten basieren auf Interfaces, die nur über DI aufgelöst werden.

2
Jaster

Freunde, die Lösung, die ich für ein ähnliches Problem gefunden habe, war, ein separates Projekt zu erstellen, den Typ WPF, den ich Startup nannte, nur mit App.xaml (und App.xaml.cs).

Darin beziehe ich mich auf das Projekt von View und ViewModel. Die Ansicht ist also nicht abhängig und ViewModel "sieht" nur die Ansicht und das Geschäft.

In App.xaml.cs deklarieren und instanziieren Sie mein MainWindow, laden Sie einige grundlegende Eigenschaften meiner App und navigieren Sie zur Seite Login (Ich arbeite mit einem Fenster und mehreren darin browsen- den Seiten).

enter image description here

2
Rodolfo Gaspar