ASP.Net Mvc - Ist es für die View akzeptabel, Funktionen aufzurufen, die Daten abrufen können?

8

Ich spiele gerade mit dem Asp.Net-mvc-Framework herum und liebe es im Vergleich zum klassischen asp.net-Weg. Eine Sache, die ich anstoße, ist, ob es akzeptabel ist, dass eine Ansicht (indirekt) Zugriff auf die Datenbank verursacht?

Zum Beispiel verwende ich den Controller, um eine benutzerdefinierte Datenklasse mit allen Informationen zu füllen, von denen ich denke, dass die View ihre Aufgabe erledigen muss. Wenn ich Objekte an die Ansicht übergebe, kann dies aber auch Datenbanklesevorgänge verursachen / p>

Ein schnelles Pseudo-Beispiel.

%Vor%

Wenn die View Zugriff auf die Produktklasse hat (sie wird an ein IProduct-Objekt übergeben), kann sie GetDiscount () aufrufen und Datenbankzugriff verursachen.

Ich denke über Möglichkeiten nach, dies zu verhindern. Momentan komme ich nur auf die Vererbung mehrerer Schnittstellen für die Klasse Product . Anstatt nur IProduct zu implementieren, würde es jetzt IProduct und IProductView implementieren. IProductView würde die Mitglieder der Klasse auflisten, IProduct würde die Methodenaufrufe enthalten, die den Datenbankzugriff verursachen könnten.

Die 'Ansicht' kennt nur die IProductView -Schnittstelle für die Klasse und kann keine Methoden aufrufen, die Datenzugriff verursachen.

Ich habe andere vage Gedanken darüber, ein Objekt zu "verriegeln", bevor es an die Ansicht übergeben wird, aber ich kann mit einer solchen Methode riesige Möglichkeiten für Nebenwirkungen vorhersehen.

Also, Meine Fragen:

  • Gibt es Best Practices in Bezug auf dieses Problem?
  • Wie verhindern andere Leute, die MVC benutzen, dass die Ansicht unartig ist und mehr mit Objekten zu tun hat, als sie sollten?
Ash 05.01.2009, 23:38
quelle

5 Antworten

3

Ihre Ansicht verursacht nicht wirklich Datenzugriff. Die Ansicht ruft einfach die GetDiscount () - Methode in einer Modellschnittstelle auf. Es ist das Modell , das den Datenzugriff verursacht. In der Tat könnten Sie eine andere Implementierung von IProduct erstellen, die keinen Datenzugriff verursachen würde, aber die Ansicht würde sich nicht ändern.

Modellobjekte, die Lazy Loading durchführen, verursachen immer Datenzugriff, wenn die Ansicht versucht, Daten zur Anzeige zu extrahieren.

Ob es OK ist, hängt vom persönlichen Geschmack und den Vorlieben ab.

Wenn Sie jedoch keinen triftigen Grund zum Lazy Loading haben, würde ich es vorziehen, die Daten in das Modellobjekt zu laden und dieses "fertig gebacken" zu übergeben, damit die Ansicht angezeigt wird.

    
Mike Scott 06.01.2009, 00:14
quelle
1
  

Eine Sache, die ich anstoße, ist, ob es akzeptabel ist, dass eine View (indirekt) Zugriff auf die Datenbank verursacht?

Ich habe oft dieselbe Frage gestellt. So viele Dinge, auf die wir in Stack Overflow Views zugreifen, können impliziten Datenbankzugriff verursachen. Es ist fast unvermeidlich. Würde gerne die Gedanken anderer hören.

    
Jeff Atwood 05.01.2009 23:54
quelle
1

Wenn Sie Ihre Domänenobjekte "dauerhaft ignorant" behalten, haben Sie dieses Problem nicht. Das heißt, anstatt getDiscount innerhalb Ihrer Product-Klasse zu haben, warum haben Sie nicht einfach eine einfache Eigenschaft namens Discount? Dies würde dann von Ihrem ORM beim Laden der Instanz der Product-Klasse aus der Datenbank gesetzt werden.

    
Kevin Pang 06.01.2009 00:18
quelle
0

Das Modell sollte keine Methoden ("Aktionen") haben, die aus Datenzugriff bestehen. Das ist die Sorge der DAL. Sie könnten eine Rabattprozenteigenschaft in der Produktklasse gespeichert haben und die GetDiscount-Methode eine einfache Berechnung wie Price * (100 - discountPercent) oder etwas ähnliches zurückgeben.

Ich trenne meine Geschäftseinheiten (Produkt in Ihrem Beispiel) vom Datenzugriff. Das ist das Repository (in meinem Fall).

    
Andrei Rînea 06.01.2009 00:09
quelle
0

Ich habe eine Site in MonoRail erstellt, die manchmal Methoden enthält, die den Datenzugriff aus der Ansicht heraus auslösen. Ich versuche es zu vermeiden, denn wenn es scheitert, kann es auf ungewöhnliche und unflexible Weise scheitern (ich kann zB eine NVelocity-Vorlage nicht wirklich versuchen / fangen). Es ist absolut nicht das Ende der Welt - ich schrieb seit Jahren gut abstrahierte PHP-Sites, die von der View aus auf die Datenbank zugegriffen haben und sie funktionieren immer noch gut genug, weil die meiste Zeit, wenn etwas explodiert, du einfach zu einem " Etwas hat nicht funktioniert "- Typ Fehler Seite sowieso.

Aber ja, ich versuche es zu vermeiden. In einem größeren Sinn tröpfelt mein Domänenmodell normalerweise nicht vollständig in die Ansicht. Stattdessen zeigt die Ansicht Document -Objekte an, die schamlos nur stark typisierte Daten-Dumps sind, mit allem vorformatiert, gepeitscht, zerquetscht und püriert bis zu dem Punkt, wo die Ansicht nur einige Strings mit einigen Loops ausspucken muss und if / else transformiert die Zahl "4" in 4-Sterne-Bilder usw. Dieses Dokument wird normalerweise von einem Web-Service zurückgegeben, der sich vor dem schönen Domänenmodell befindet, oder es ist nur eine einfache Struktur, die im Controller erstellt wurde als Teil von ViewData weitergegeben. Wenn ein Domänenobjekt direkt verwendet wird, tut es normalerweise nichts, um den Datenzugriff explizit auszulösen. Dies wird von einem sammlungsähnlichen Repository gehandhabt, auf das die Ansicht keinen Zugriff hat und auf das die Domänenobjekte normalerweise keinen Zugriff haben.

Aber Sie müssen es nicht so machen. Sie könnten einfach genug displinkiert werden, um nur die Methoden aufzurufen, die die Datenbank aus der Sicht berühren.

    
Nicholas Piasecki 06.01.2009 00:19
quelle