ASP.NET MVC - sollten M, V und C der MVC Domänenentitäten explizit kennen?

8

Da diese Frage ziemlich subjektiv zu sein scheint, poste ich sie hier.

Lassen Sie uns sagen Sie Ihre eigene Version von ASP.NET MVC zu schreiben Stackoverflow verwendet wird , so gibt es Klassen , wie Question, Answer, Userusw. Da Sie faul, Sie beschlossen , Entity Framework zu verwenden. Alle oben genannten Klassen haben also Navigationseigenschaften: Questionkennt ihre Answers, Answerweiß, Userwer sie gepostet hat usw.

Sie haben viele Bücher von Martin Fowler gelesen, daher werden Sie mit Sicherheit eine Service-Schicht haben, um die gesamte Geschäftslogik dort zu implementieren. Sie werden ASP.NET MVC nur für die Benutzeroberfläche und die Anwendungslogik verwenden.

Es gibt 2 Fragen:

  1. Werden Sie direkt Objekte aussetzen Question, Answerund andere zu den Controllern?
  2. Wirst du dasselbe für Ansichten tun?

Ich werde meiner Anwendung im Grunde weder eine REST-API zur Verfügung stellen, noch bin ich zu konservativ, um nur irgendwelche Befürchtungen zu haben wie "Hey, MY VIEW weiß, was das Questionist, ich weiß nicht, ob es schlecht ist oder nicht." Ich mag es einfach nicht! ".

Ich bin besonders neugierig auf den Fall, dass die QuestionKlasse ein Feld wie hat TimePostedund Sie Ihre PostNewQuestionAnsicht an diese Klasse binden . Ich weiß, dass für den Fall, dass ich dieses Feld nicht an ein Steuerelement auf der Seite binde, es nicht veröffentlicht wird. Daher werde ich dieses Feld auf setzen, nullwenn ich das Objekt auf meiner Controllerseite habe. Wird es als gut angesehen oder ist es eine schlechte Idee? 2 entgegengesetzte Ansätze, an die ich denke, sind "überall DTOs / ViewModels verwenden" und "wtf, weniger Klassen sind immer besser!"

Was halten Sie für einen richtigen Ansatz? (Ich weiß, dass es keine direkte Antwort gibt, daher lautet die Frage tatsächlich: "Was sollte man beachten, um zu entscheiden, ob die Verwendung von DTOs / ViewModels / Was ist sonst noch gut für die Architektur der App?")

Bitte beachten Sie auch, dass wir einen sehr vereinfachten Klon von Stackoverflow in Betracht ziehen, also:

  1. Es ist ein reines Webprojekt (wir werden die REST-API oder was auch immer nicht verfügbar machen)
  2. Es gibt Benutzer, Fragen, Antworten, Tags und Suchfunktionen (keine herausragende Geschäftslogik).
  3. Es gibt ungefähr 100 aktive Benutzer pro Tag (keine besonderen Leistungsanforderungen)
  4. Der Code sollte lesbar sein und es sollte keine Überraschungen oder Orte von besonderem Interesse geben, falls ein neues Mitglied dem Entwicklerteam beitritt.

Sie können auch Ihre Gedanken äußern, falls einer der ersten 3 Punkte geändert wird - "Der Kunde möchte jetzt, dass unser Service 10000 gleichzeitige Benutzer zulässt" oder "Wir müssen jetzt nur jedem einzelnen Benutzer erlauben, einmal pro 15 Minuten zu posten" usw.

Vielen Dank!

Andrey Agibalov
quelle

Antworten:

3

Ich habe nicht viel mit MVC gearbeitet, aber ich habe viel mit MVVM gearbeitet und hier ist meine Meinung dazu:

Question,, Answerund Usersind alle Datenobjekte. Es ist in Ordnung, dass sie sich kennen, aber sie sollten nichts außerhalb der Datenobjektebene kennen, wie z. B. Ansichten, Controller, ViewModels usw.

In einer idealen Welt verweist Ihre Ansicht nur auf die Modelle. Sie kennen den Controller vielleicht, sollten ihn aber nicht direkt referenzieren müssen. Das ViewModel kennt nur andere Modelle. Der Controller kennt Modelle und ViewModels. Die Ansicht ist überhaupt nicht wichtig, obwohl sie die Ansicht mit ViewModels oder Modellen versorgt.

Ihre Objekte sehen also folgendermaßen aus:

  • M odelle kommen in zwei Varianten: Models und Viewmodels.

    • Modelle sind einfache Datenobjekte, die lediglich zum Speichern von Daten vorhanden sind und im Allgemeinen Datenbankdaten widerspiegeln. Sie greifen nicht auf die Datenbank zu oder enthalten keine Geschäftslogik, die nicht mit ihnen zusammenhängt.
    • ViewModels sind Datenobjekte, die Daten enthalten, die die Ansicht benötigt, nicht unbedingt das, was die Datenbank benötigt. Sie können Modelle enthalten, obwohl Modelle keine ViewModels enthalten sollten.
  • C ontrollers enthalten Ihre Geschäftslogik. Sie steuern die Datenzugriffsaufrufe, erstellen Modelle / ViewModels, die an die Ansicht übergeben werden sollen, erweiterte Geschäftslogik wie Berechtigungen usw. Sie steuern im Grunde die gesamte Codeschicht.

  • V iews werden nur verwendet , um dem Anwender über eine benutzerfreundliche Schnittstelle zu geben. Sie akzeptieren entweder ein ViewModel oder ein Model und zeigen es auf eine Weise an, die für den Benutzer gut aussieht.

Rachel
quelle
MVVM macht in einem Webprojekt nicht wirklich Sinn ...
Yannis
1
@YannisRizos Dies ist nicht MVVM, es ist MVC. MVC hat auch ViewModels, aber sie sind Teil der Modellebene. Sie sind im Wesentlichen Modelle für die Ansichten, nicht ihre eigene Ebene, die Geschäftslogik enthält (wie sie in MVVM sein würden). Ich würde MVVM nur empfehlen, wenn Sie mit WPF / Silverlight arbeiten.
Rachel