Der Weg zum eigenen MVVM-Framework – Part 1 (Projektstruktur)

Im ersten Schritt auf dem Weg zum eigenen MVVM-Framework liegt neben der Planung auch schnell die Projektstruktur. In diesen Tutorial werde ich jedoch die bereits erledigte Planungsphase Stück für Stück mit den passenden „Tutorial“-Part veröffentlichen. Auch möchte ich darauf Hinweisen, dass es Hilfreich ist folgende Posts zunächst zu lesen, bevor Ihr mit diesen fortfahrt:

Bitte beachtet hierbei das ebenfalls bereits ein Grundverständnis für C# und .NET Framework bestehen sollte. Hier reichen allerdings Grundkenntnisse. Nun gut, fangen wir an mit unserer Projektstruktur.

Zunächst einmal hätten wir da unseren Aufbau. Dieser ist das Elementarste überhaupt im Framework, den nur wer weiß wo sich was befindet kann auch damit Arbeiten. Zunächst habe ich mir deshalb darüber Gedanken gemacht, welche Projekte es geben soll und wie diese zusammenhängen. Siehe hierfür die folgende Grafik.

Aufbaustruktur.png

Aufbaustruktur des SmallMvvm-Frameworks

Nun gut, was haben wir hier also nun. Zunächst einmal hätten wir da unseren Kern, das „Core“-Projekt. Dieses hat auf nichts Referenzen und bildet die absolute Basis des Frameworks. Die Abstraktion auf dieser Schicht müssen also dementsprechend hoch sein. Auch hätten wir hier das „Services“-Projekt, welches ebenfalls keinerlei Referenzen benötigt. Allerdings wäre es hier denkbar dass irgendwann eine Referenz auf „Core“ entstehen könnte. Im „Services“-Projekt werden die service Grundlagen definiert und verwaltet. Die genaue Definition von Services findet anschließend in „Services Common“-Projekt statt. Warum nicht direkt in „Services“? Ganz einfach – so sind dies Optional falls mal eigene Service nötig sind und keine Standardmäßigen aus dem Framework. Als nächstes hätten wir das „Application“-Projekt welches Standardmethoden für Anwendungsbehandlungen definiert. Hier wird es in naher Zukunft den Einstiegs-punkt von Anwendungen geben, da hier die essentiellen Teile zusammen gesetzt werden. Nun wäre da noch „Presentation“ welches die ViewModel-Funktionalitäten beinhalten wird, „Presentation WPF“ welches die Bindung zwischen ViewModel und WPF-Oberflächen herstellen wird und „Presentation WPF Common“ welches Standard Themes, MessageBoxen uns mehr definieren wird. Die Trennungen bei den Presentation-Projekten haben den gleichen Grund, wie bei den Services.

So viel zur Planung der Projektstruktur. Kommen wir nun zum Anlegen. Die Projektstruktur wird im VS2012 angelegt. Hierbei wird zunächst ein „Common“ sowie ein „UnitTests“ Projektordner angelegt. Nun wird im „Common“-Ordner die Datei „CommonAssemblyInfo.cs“ angelegt, welche die Standard Assembly-Informationen beinhaltet. Nun werden folgende Projekte direkt in der Solution angelegt:

  • SmallMvvm.Application
  • SmallMvvm.Core
  • SmallMvvm.Presentation
  • SmallMvvm.Presentation.Wpf
  • SmallMvvm.Presentation.Wpf.Common
  • SmallMvvm.Services
  • SmallMvvm.Services.Common

Im nächsten Schritt werden sämtliche Projekte mit der zusätzlichen Erweiterung „.UnitTests“ angelegt. Nun werden die Grundlegenden Referenzen geschaffen (siehe Aufbaustruktur). Außerdem bekommen die UnitTest-Projekte natürlich eine Referenz auf ihr jeweiliges normales Projekt. Nun müssen noch die in der „CommonAssemblyInfo.cs“ Ausgelagerten Assembly-Informationen aus allen anderen AssemblyInfo.cs-Dateien entfernt werden und die Common-Datei als Link zu den einzelnen Projekten hinzugefügt werden (der Pfeil beim „Hinzufügen“-Button, wenn eine Vorhandene Datei hinzugefügt werden soll).

Für die CommonAssemblyInfo.cs würde ich folgenden Inhalt empfehlen:

using System.Reflection;

[assembly: AssemblyCompany("<DEIN NAME>")]
[assembly: AssemblyCopyright("Copyright © 2013 <DEIN NAME>, All rights reserved.")]
[assembly: AssemblyTrademark("")]

[assembly: AssemblyVersion("1.0.0.*")]
[assembly: AssemblyFileVersion("1.0.0.*")]

Nun ist es noch erforderlich, das sämtliche Projekte (z.B. mittels NuGet) Referenzen auf ihre nötigen Assemblys bekommen (Normale Projekte: log4net; UnitTest Projekte: log4net sowie NUnit).

Dies wäre unsere Projektstruktur. Fragen, Anregungen, Kritik, Hinweise und vieles mehr bitte über die Kommentar-Funktion. Nachfolgenden nun nochmal die Referenzen zu unseren Projekt.

Redmine-Projekt (SmallMvvm):
https://redmine.kruse-familie.eu/projects/small-mvvm

Repository (Mercurial, benötigt Redmine-Login):
https://kruse-familie.eu/hg/small-mvvm

Ebenfalls könnt Ihr den aktuellen Stand des Frameworks hier beziehen: Small MVVM – Revision 2