Wer füllt das ViewModel in ASP MVC 5

7

Wessen Aufgabe ist es, die Werte in einer ASP MVC 5 Architektur (C #, EF) für z.B. wenn wir PurchaseRecordsViewModel , PurchaseRecords Domain Model , PurchaseController

haben
  • Beträgt der Code zum Auffüllen von Daten (Zeit, Kosten usw.) das Viewmodel, direkt in seinem eigenen Viewmodel go in PurchaseRecordsViewModel ?

  • Oder geht der Code in die Aktionsmethode von PurchaseController

  • ?
aggie 15.10.2014, 20:11
quelle

4 Antworten

6

Nach Tommys Antwort folgt hier ein Code, der zu seiner Beschreibung passt.

%Vor%     
CSharper 15.10.2014, 20:52
quelle
11

View-Modelle sind typischerweise nur dumme Sammlungen von Eigenschaften. Das Auffüllen eines Ansichtsmodells erfolgt in der Regel innerhalb Ihrer Serviceebene oder, falls Sie keine haben, Ihrer Aktionsmethode.

Denken Sie über die Rollen auf diese Weise nach.

  • Ein Domänenmodell ist eine direkte Zuordnung zu einer Datenbanktabelle.
  • Ein Ansichtsmodell ist eine Sammlung von Eigenschaften, die zum Anzeigen einer Ansicht benötigt werden.
  • Eine Service-Schicht ruft / verwendet ein oder mehrere Domänenmodelle und füllt ein Ansichtsmodell.
  • Eine Service-Schicht kann auch ein Ansichtsmodell erstellen und ein oder mehrere Domänenmodelle erstellen / aktualisieren
  • Eine Controller-Action-Methode ist der Leim zwischen den beiden. Es ruft eine Service-Schicht auf, um ein Ansichtsmodell zu erhalten (GET) und an eine Ansicht zu übergeben. Diese Aktionsmethoden nehmen auch ein View-Modell (POST) und übergeben es an die Service-Schicht, um alles Notwendige zu tun.

Eine weitere häufig gestellte Frage ist, warum ich keine Domänenmodelle für eine Ansicht verwenden kann. Sie können, aber in der Regel Dinge wie, benötigen Daten aus mehr als einem Domänenmodell, nicht alle Eigenschaften, die in der Domain-Modell sind und zuletzt, müssten Sie sich jetzt Sorgen über Eigenschaften in der Domain-Modell, dass Sie aktualisiert werden hatte nicht vorgehabt.

    
Tommy 15.10.2014 20:34
quelle
6

Idealerweise sollte sich PurchaseRecordViewModel selbst mit PurchaseRecordsDomainModel füllen. Es sollte eine einfache Zuordnung von Eigenschaften und möglicherweise eine Formatierung der Ausgabe enthalten, die Sie in Ihrer Ansicht verwenden werden.

PurchaseRecordsViewModel

%Vor%

PurchaseRecordViewModel

%Vor%

Was Ihre action -Methode für PurchaseController tun sollte, ist das Orchestrieren des Prozesses zum Abrufen von PurchaseRecordsDomainModel , das Erstellen von PurchaseRecordsViewModel von PurchaseRecordsDomainModel und das Übergeben an View . Action method selbst sollte keinen Code enthalten, der sich mit dem Verbinden und Abrufen von Daten aus der Datenbank (in Ihrem Fall das Abfragen von EF context) oder einer Geschäftslogik befasst. Sie sollten versuchen, lose gekoppelte Module zu haben, die über abstractions miteinander kommunizieren. Auf diese Weise stellen Sie sicher, dass Ihre Anwendung maintainable , extensible und testable ist.

Versuchen Sie auch, eine klare Trennung zwischen verschiedenen Ebenen Ihres Systems zu erzielen. Zum Beispiel ist es keine gute Idee, EF entities als Domain Model Entites zu haben. Du willst nicht, dass dein business logic layer von data access layer abhängt, denke darüber nach, was ist, wenn du irgendwann von EF wegkommst und ein paar ORM oder even verwendest andere Technologie zum Speichern und Abfragen von Daten. Sie möchten business logic layer nicht ändern, nur weil Sie Ihre data access layer ändern. Also, in Ihrem Fall von Wörtern zu Code zu gehen.

Wenn Sie bereits Ihre view und view model haben, würde ich PurchaseRecordsService class in domain layer erstellen (Bitte beachten Sie, dass Sie in diesem Fall nicht Repositories verwenden, sondern eine andere Technik, dieses Beispiel ist hauptsächlich, um meinen Punkt zu veranschaulichen)

%Vor%

Dann könnten Sie in Ihrem domain layer IPurchaseRecordsRepository

definieren %Vor%

Die Idee ist, dass unser PurchaseRecordsService eine Möglichkeit benötigt, mit Datenbanken zu kommunizieren, also muss derjenige, der es benutzt, die Implementierung von IPurchaseRecordsRepository liefern. Der nächste Schritt ist, zu unserem data access layer zu gehen und die Implementierungsklasse von IPurchaseRecordsRepository zu erstellen.

%Vor%

Und das letzte Stück - wir müssen unser Action in PurchaseController

definieren %Vor%

Um es kurz zu wiederholen: Was wir haben, ist ein lose gekoppelter Code, unsere Presentation und Data Access Layer wissen nicht voneinander, und sie hängen nur von Domain layer ab. Wenn Sie möchten, können Sie MVC frontend durch WPF ersetzen, zum Beispiel von EF zu einer anderen Technologie wechseln, Ihr Code ist testbar.

    
Michael 15.10.2014 21:28
quelle
3

Idealerweise sollte Ihr Ansichtsmodell Ihr Domänenmodell nicht kennen. Daher würde ich sagen, dass Sie Ihre Populationslogik in Ihren Controller legen, vielleicht in einer Art Mapping / Population-Utility-Klasse.

Aber denken Sie daran, wenn es um Fragen geht, wo man bestimmte Logik setzen soll, dann geht die persönliche Vorliebe sehr weit.

    
Tobias 15.10.2014 20:36
quelle