2009-07-27 16 views

Antwort

7

Persönlich mag ich nicht, was Dino da macht und ich würde das Problem nicht auf die gleiche Weise angehen. Normalerweise denke ich an eine VM als eine gefilterte, gruppierte und sortierte Sammlung von Modellklassen. Eine VM für mich ist eine direkte Zuordnung zur View, daher könnte ich eine NewOrderViewModel-Klasse erstellen, die mehrere CollectionViews für die View verwendet (möglicherweise einen Lebenslauf für Kunden und einen anderen Lebenslauf für Produkte, wahrscheinlich beide gefiltert). Das Erstellen einer völlig neuen VM-Klasse für jede Klasse im Modell verstößt meines Erachtens gegen DRY. Ich würde eher die Ableitung oder partielle Klassen verwenden, um das Modell bei Bedarf zu ergänzen, indem ich View-spezifische (oft berechnete) Eigenschaften hinzufüge. IMO .NET RIA Services ist eine hervorragende Implementierung der Kombination von M- und VM-Daten mit dem zusätzlichen Bonus, dass es sowohl auf dem Client als auch auf dem Server verwendet werden kann. Dino ist ein brillanter Typ, aber eine Art, ihn anzurufen.

+0

Einverstanden, die VM sollte nur diejenigen Teile des Modells sein, von denen die View wissen sollte. –

2

DRY ist ein Prinzip, keine harte Regel. Du bist ein Mensch und kannst dich unterscheiden. Zum Beispiel Wenn DRY wirklich eine harte Regel wäre, würden Sie niemals zwei Variablen denselben Wert zuweisen. Ich nehme an, in jedem nicht trivialen Programm hätten Sie mehr als eine Variable, die den Wert 0 enthält.

Generell gilt: DRY trifft normalerweise nicht auf Daten zu. Diese ansichtsspezifischen Einheiten wären wahrscheinlich nur Datenübertragungsobjekte ohne nennenswerte Logik. Daten können aus verschiedenen Gründen dupliziert werden.

+0

Noch finde ich das ziemlich schlecht, da Sie helle Entitätsklassen für das Ansichtsmodell erstellen und die für die tatsächlichen Entitäten wiederholen würden – terjetyl

+0

Warum finden Sie das schlecht? – EricSchaefer

+0

Ich denke, es ist eine schlechte Verletzung von trocken, weil Sie 2 fast identische Klassen erstellen, die die gleiche Entität auch ohne Verwendung der Vererbung – terjetyl

1

Ich denke, die Antwort hängt wirklich davon ab, was Sie im ViewModel sein sollten. Für mich repräsentiert das ViewModel das Modell des gerade angezeigten Bildschirms.

So etwas wie ein ViewCategoryViewModel, ich habe keine Verdoppelung der Felder in der Kategorie. Ich exponiere ein Category-Objekt als eine Eigenschaft auf dem ViewModel (unter "SelectedCategory"), alle anderen Daten, die die Ansicht anzeigen muss, und die Befehle, die dieser Bildschirm ausführen kann.

Es wird immer eine gewisse Ähnlichkeit zwischen dem Domänenmodell und dem Ansichtsmodell geben, aber alles hängt davon ab, wie Sie das ViewModel erstellen.

1

Es ist das gleiche wie bei Data Transfer Objects (DTO).

Die Domäne für diese beiden Objekttypen unterschiedlich ist, so es von DRY nicht eine Verletzung ist.

Betrachten Sie das folgende Beispiel:

class Customer 
{ 
    public int Age 
} 

Und ein corsponding Ansicht Modell:

class CustomerViewModel 
{ 
    public string Age; 

    // WPF validation code is going to be a bit more complicated: 
    public bool IsValid() 
    { 
     return string.IsNullOrEmpty(Age) == false; 
    } 
} 

Differnt Domains - differnet Immobilienarten - verschiedene Objekte.

+0

1. Was ist eine Domäne in diesem Kontext? 2. Ihr Geschäftsmodell hat eine Kundeneinheit. Stellen Sie sich vor, Sie hätten eine Kunden-Entität, eine Kunden-DTO und ein CustomerView-Modell. Sie hätten dort natürlich viele doppelte Eigenschaften. Ich sehe dies als eine klare Verletzung von DRY – terjetyl

+0

1. Der Kunde ist wahrscheinlich mit NH auf der Datenbank zugeordnet, es kann sogar einige Hacks wegen nicht-so perfekte DB-Schema enthalten. Es hat viele Geschäftsmethoden, Sammlungen, die höchstwahrscheinlich nicht benötigt werden, wenn Sie es auf dem Bildschirm anzeigen. 2. Das Prinzip der einfachen Verantwortlichkeit (Single Responsibility Principle, SRP) besagt, dass das Objekt nur einen Grund haben sollte, um zu ändern, wenn die Kundenklasse in MVVM als Geschäftsmodell, DTO und ViewModel verwendet wird, da SRP eindeutig flüchtig ist. Beachten Sie, dass ich zustimme, dass es Situationen gibt, in denen es einfacher ist, nur eine einzige Klasse zu haben, alles hängt vom Kontext ab. –

+0

Beachten Sie auch Eigenschaften wie IsSelected in ViewModel und Abbrechen der Edition auf dem Bildschirm (Sie müssen das Customer-Objekt zurücksetzen, wenn Sie keine CustomerViewModel-Klasse binden), die Implementierung von INotifyPropertyChanged. Nur in einem sehr vereinfachten Szenario scheint es eine Verletzung von DRY zu sein. –