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
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
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.
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.
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)
Dann könnten Sie in Ihrem domain layer
IPurchaseRecordsRepository
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.
Und das letzte Stück - wir müssen unser Action
in PurchaseController
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.
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.
Tags und Links asp.net-mvc c# entity-framework viewmodel