Ich habe folgende Ebenen in meiner Lösung:
- App.Domain
- App.Service
- App.Core (vielleicht nennst du diese App.DataLayer)
- App.Web
Software Design Pattern ist nicht meine Frage, ich habe folgendes Model in Domain
public class Foo {
public int Id {get;set;}
public int Name {get;set;}
public int Value {get;set;}
}
Ich möchte dieses Modell in der Ansicht verwenden (z. B. auf der Startseite) UND ich möchte es verwenden Id, Name & Value
. Wenn ich also ViewModel erstellen möchte, füge ich Folgendes hinzu:
public class FooViewModel {
public int Id {get;set;}
public int Name {get;set;}
public int Value {get;set;}
}
Also, ist das eine gute Idee? oder einfach Foo
statt verwenden FooViewModel
?
asp.net-mvc
model
Mehdi Dehghani
quelle
quelle
Model
normalerweise nicht an die weitergereichtView
? Warum genau müssen Sie die FelderModel
in der neu erstellenView
? Wenn die Trennung von Anliegen ein Ziel von istMVC
, unter welchen Umständen würde man das gleiche mitModel
und tun wollenView
? WennViewModel
beides ist, warum nicht durch Erweitern / Komponieren von beidemModel
undView
?Antworten:
Dies mag zunächst wie eine Verletzung der DRY-Regel aussehen, aber ich würde argumentieren, dass "ähnlicher und sogar identischer Code" nicht unbedingt "Wiederholung" ist, wenn er etwas anderes tut oder sich unabhängig ändern kann. Und im Fall von Ansichtsmodellen definiert der Code, was der "Kunde" sieht, nicht unbedingt die Entitäten und Operationen, über die das Unternehmen spricht. Daher werden dem Client oder der Benutzeroberfläche häufig Modelle angezeigt, die "zufällig identisch" sind. Sie können entweder die Geschäftsregeln und -bedingungen oder die Endbenutzerterminologie unabhängig voneinander ändern.
Also, ich würde die Frage an Sie zurückdrehen. Wenn sich die Domäne ändert, können die Clients der Version 1 die alten Schnittstellen weiterhin verwenden? Werden Sie jemals Begriffe oder Vorgänge in der Benutzeroberfläche anzeigen, die nicht zu den "Kerngeschäftsregeln" gehören? Und umgekehrt?
Diese Art von Fragen im Hinterkopf, wenn die "Funktion" Ihrer Ansicht ausschließlich darin besteht, das zugrunde liegende Domänenmodell zu offenbaren, ja, dies scheint die DRY-Regel zu verletzen.
Bedenken Sie auch, dass das Anzeigen einer Ansicht, die sich bei Modelländerungen natürlicher ändert, auch in einigen Sprachen mit Elementattributen und Reflexion möglich ist. (Oder mit weniger Wiederholungen durch andere Meisterleistungen der Klugheit ... Aber "Klugheit" kann die Wiederholung, die sie Ihnen erspart, oft nicht rechtfertigen.)
quelle
Foo
, also wenn ich esFoo
als ViewModel benutzte Auch der Client erhält eine neue Eigenschaft. Was soll ich also tun, wenn es sich bei dieser neuen Eigenschaft um ein Sicherheitsfeld handelt (möglicherweise "Wahr / Falsch" für die Erlaubnis oder ähnliches)?User edit form
wir keinIsAdmin
Feld an den Client übergeben müssen, um dieses Feld sicher zu halten. Entschuldigung für mein schlechtes Englisch.Ich hätte ein Ansichtsmodell, das nur eine Eigenschaft enthält, eine Foo-Instanz. Auf diese Weise verletzen Sie DRY nicht gemäß einer Definition davon, wenn sich Foo ändert, Ihr Ansichtsmodell die Änderung automatisch sieht und Sie sich von einer direkten Bindung des Ansichtsmodells an das Modell frei lassen.
Wenn die Ansicht morgen etwas anderes als das Foo anzeigen muss, können Sie einfach eine neue Eigenschaft hinzufügen, und die Absicht Ihres Ansichtsmodells ist weiterhin klar, es enthält ein Foo und etwas anderes, das Sie nicht haben eine Mischung von Eigenschaften von Foo mit nicht verwandten anderen Eigenschaften.
Ich würde Ihr Ansichtsmodell nicht als FooViewModel betrachten, sondern als das, was in der Ansicht angezeigt werden soll. Wenn nur ein Foo angezeigt wird, enthält das Ansichtsmodell eine Eigenschaft, ein Foo.
Ich bin mir nicht sicher, ob ich das klar erklärt habe. Wenn nicht, lass es mich wissen und ich versuche es umzudrucken, wenn ich wach bin!
quelle
Ich würde sagen, dass die Verwendung
FooViewModel
auf diese Weise das DRY-Prinzip verletzt. Wenn Sie eine Änderung an vornehmen müssen, müssenFoo
Sie auch eine Änderung an vornehmenFooViewModel
. Ich denke, Sie wären besser bedient,Foo
wenn Sie einfach das Modell für Ihre Ansicht verwenden würden. Ich würde ein Ansichtsmodell in Betracht ziehen, wenn Sie Dinge von Foo und etwas anderes anzeigen müssen. Angenommen, Sie müssen einige Informationen vonFoo
und auch von rendernBar
.quelle
Foo
Da ich also auchFoo
ViewModel verwendet habe, muss ich dieses neue Feld auch an die Ansicht übergeben. Ich denke, das ist kein gutes Geschäft ?Foo
undFooViewModel
. Im Allgemeinen ist es keine gute Idee, mehrere Dateien für eine einzige logische Änderung ändern zu müssen.true/false
Wert für die Berechtigung oder ähnliches ?