2009-08-07 8 views
0

Ich fange gerade an, in das MVVM-Muster für WPF zu graben, aber weil ich kein professioneller Entwickler bin, fühle ich mich manchmal etwas verloren.Abhängigkeiten in der MVVM

Das Hauptproblem, das ich habe, ist zu entscheiden, wer wen erstellen sollte: Sagen wir, ich habe eine Datenbank, die Hunde und Katzen speichert. Ich hätte dann einen DatabaseManager, der mit der Datenbank (Unit of Work !?), einem DogRepository/CatRepository und den Dogs/Cats-Objekten kommuniziert.

Auf der anderen Seite habe ich mein MainWindow, mit dem der Benutzer die Datenbank öffnen/schließen kann und die eine Listbox für Katzen und eine für Hunde enthält, also brauche ich ein MainWindowViewModel, CatsViewModel und DogsViewModel.

Aber wie erstelle ich diese Objekte? In meiner Anwendung erstelle ich offensichtlich das MainWindow. Und dann? Erstelle ich ein MainWindowViewModel und übergebe es an das MainWindow oder erstellt das MainWindow sein eigenes MainWindowViewModel? Wie wird der DatabaseManager erstellt? Durch das MainWindowViewModel?

Was ist mit dem CatsViewModel und dem entsprechenden CatRepository? Erstellt das MainWindowViewModel das CatsViewModel, das wiederum ein CatRepository erstellt? Ich bin wirklich verwirrt.

Antwort

1

Sie sind verwirrt, weil alle diese Optionen gültig sind. Wenn Sie keine Dependency-Injection verwenden und die ViewModels alle benötigten Informationen selbst haben, gibt es keinen Grund, dass die View das ViewModel nicht erstellt (normalerweise durch Erstellen einer View über eine StaticResource für die View:

<Window.Resources> 
    <local:CatViewModel x:Key="catVM" /> 
</Window.Resources> 
<Grid DataContext="{StaticResource catVM}"> 
... 
</Grid> 
)

Wenn Sie sind Dependency Injection verwenden, ist es weiterhin volle Gültigkeit zu Ihrer VM als Abhängigkeit Ihrer Ansicht in seinem Konstruktor zu deklarieren:

public CatView(CatViewModel vm) : this() 
{ 
    this.DataContext = vm; 
} 

die letzte Option ist das Konzept eines dritten, die beide erzeugt die Aussicht und das Aussichtsmodell (ist jedoch angemessen) und heiratet sie fr om außerhalb von beiden. Normalerweise wird dies als Presenter bezeichnet.

In jedem Fall sind alle diese Optionen gültig. Sie sollten das auswählen, das für Sie am besten geeignet ist. Ich bin mir sicher, dass jemand kommen wird, der Blasphemie fordert, aber es hängt wirklich von Ihren Bedürfnissen und Ihrem Projekt ab.

+0

Vielen Dank für Ihre Erklärung. Ich brauchte eine Weile, um mich mit WPF und MVVM vertraut zu machen, und jetzt kann ich deine Antwort schätzen. – CaptainProton

+0

Ich bin froh, dass ich helfen konnte! –

0

Das View-Model-ViewModel-Muster (MVVM) definiert nicht, wer für die Erstellung der verschiedenen Klassen zuständig ist. Daher finden Sie viele verschiedene Ansätze in der MVVM-Community.

Ich verwende gerne einen Application Controller oder Use-Case-Controller, die den Arbeitsablauf der Anwendung behandeln und daher verantwortlich für die Erstellung der ViewModel- und Repository-Klassen sind.

Ein konkretes Beispiel, wie das funktioniert in der Ansichtsmodell Probe des Projekts gezeigt:

WPF Application Framework (WAF)

http://waf.codeplex.com