MVC Reduzierung von sich wiederholendem Code

8

Ich habe gerade angefangen zu verwenden und verliebe mich in MVC Design Pattern.

Mein einziges Ärgernis ist, dass es eine Menge repetitiven Code zu produzieren scheint. Zum Beispiel.

Ich habe eine Standard-MVC-App mit meiner DB (Modelle) in einem Projekt, getrennt von meinen Controllern / Views / Viewmodels in einem anderen, wiederum getrennt von meinen Testmethoden in einem anderen. Alles funktioniert super.

Modelle: Jetzt habe ich ein paar nette EF4-Klassen in meinem DB-Projekt, für die ich in meinem realen Projekt ViewModels verwenden muss, um auf meine Daten zuzugreifen. Kein Problem hier.

Controller: Aber jeder Controller, den ich habe, tut genau das Gleiche. Es bekommt und setzt die Daten von den ViewModels, so dass jeder Controller anders ist, da er nur unterschiedliche Daten erhält, sie machen im Wesentlichen den gleichen Job, auf die gleiche Weise. (Ich habe derzeit 9, aber das könnte leicht zu weit über 50 explodieren.)

Zum Beispiel:

%Vor%

Ansichten: Jede von den Contollern erzeugte Ansicht funktioniert großartig. Ausgenommen sind nur die Daten (Felder mit Beschriftungen und Textfeldern). Noch einmal, sie alle machen den gleichen Job (aber mit verschiedenen Datensätzen).

%Vor%

Problem: Ich möchte einen einzigen Controller erstellen und dynamisch machen. So dass es Daten von verschiedenen Ansichtsmodellen lesen kann. (Warum haben 9 oder 50 Controller im Wesentlichen den gleichen Job)

Dann möchte ich das auch mit den Ansichten machen. Damit können verschiedene Felder dynamisch generiert werden. (Warum haben 9 oder 50 Ansichten alle die gleiche Arbeit). Wenn die Ansicht auf dem Controller basiert, sollte sich die Ansicht basierend auf ihren Eigenschaften ändern können.

Im Wesentlichen möchte ich nur eine Möglichkeit finden, dem Controller zu sagen, dass er vom Ansichtsmodel X oder VM - Y oder VM - Z ekt lesen soll und die Eigenschaften erzeugen, die zugehörigen Daten abrufen und an sie übergeben soll die Ansicht, die beim Empfang die Felder mit Beschriftungen und Textfeldern erzeugt.

Ich denke, ich möchte wissen, ob es eine Möglichkeit gibt, dies durch Reflexion zu tun. Da die View-Modelle Grundklassen mit einfachen Eigenschaften sind. Man könnte möglicherweise eine Basis-Controller-Klasse erstellen, die eine Methode zum Einlesen eines angegebenen viewmodel-Objekts, zum Abrufen ihrer Eigenschaften, zum Einlesen einer zugehörigen Tabelle und zum Vergleichen der Felder in dieser Tabelle mit den Eigenschaften in der Klasse enthält. Schließlich kann man den Datensatz aus der Tabelle zur Anzeige übergeben. Die Ansicht kann dann automatisch basierend auf einer Art Rasierer, c # oder Javascript generiert werden.

Irgendwelche Versuche, ob das möglich ist oder nicht, wären willkommen.

    
Francis Rodgers 22.05.2012, 15:13
quelle

4 Antworten

10

Sie können AutoMapper verwenden, um den gesamten Code zum Kopieren von Werten zwischen Modellen / Elementen zu entfernen.

Ziehen Sie auch die Verwendung von Layouts, Datenanmerkungsattributen und Vorlagen (mit Html.DisplayFor und Html.EditorFor) in Betracht, um Ihre Ansichten zu verkleinern.

Ссылка

Sie könnten eine Möglichkeit untersuchen, eine generische Basis-Controller-Klasse zu erstellen, die den Typ von Model und Entity übernimmt und eine allgemeine Logik für CRUD-Operationen enthält, aber dies könnte zu weit gehen und Ihre Entwicklung später behindern / p>     

Jakub Konecki 22.05.2012, 15:14
quelle
5

Ich denke, dass ein dynamischer Controller möglicherweise einen Schritt zu weit führen würde - was passiert, wenn Sie alles generisch machen und dann eine Ihrer Ansichten etwas komplexer als eine einfache Karte für die Datenbank erfordert - erweitern Sie Ihren generischen Ansichtscontroller 'damit umgehen? Könnte hier enden hier.

Sie sollten sich vielleicht einen Blick auf den Automapper werfen, um einige der sich wiederholenden Probleme beim Umgang mit Ihren Viewmodels zu beseitigen.

Ссылка

    
Paddy 22.05.2012 15:17
quelle
0

Sie können eine EditFor / Model Templates für ein Objekt oder Ihre Basisklasse erzeugen, was auch immer es ist, und dann eine Ansicht erstellen, die Ihr Modell, seine Metadaten (mit Hilfe von mvc metadataproviders) akzeptiert und das erstellt Felder dynamisch nach.
dieser Beitrag deckt hwo es kann in mvc2 getan werden, aber Sie können diese Technik leicht auch an mvc 3 anpassen ..
Ich benutze eine solche Vorlage in einem Projekt mi, wo ich einige Dutzend verschiedene Entitäten habe, die alle das gleiche Aussehen und Gefühl teilen. Mit der Hilfe meines eigenen Metadataproviders, der mir hilft, die Reihenfolge der Felder zu bestimmen und ob sie in jeder Ansicht sichtbar sein sollen, habe ich genau eine Ansicht erstellt, um alle meine Entitäten anzuzeigen.

    
YavgenyP 22.05.2012 15:18
quelle
0

Ich stimme hier mit anderen überein, dass ein einziger dynamischer Controller für die Handhabung aller Modelle und Ansichten in Ihrer Anwendung zu weit geht. Es gibt andere Möglichkeiten, die Menge an Code in Controllern zu reduzieren. Andere Antworten hier haben AutoMapper erwähnt, der ein großartiges Werkzeug ist. Der Erfinder von AutoMapper, Jimmy Bogard, hat auch ein großes Video hier , das andere Dinge enthält, die Sie tun können, um die Menge von Code in Ihren Controllern.

Was Sichten betrifft, können Sie bereits eine Ansicht verwenden, die alle Ihre Controller mithilfe von EditorTemplates behandelt. Sie können ein benutzerdefiniertes EditorTemplate erstellen, das Reflektion verwendet, um das Modell zu untersuchen und die Eingabefelder entsprechend zu rendern. Dies alles verwendet "Modell-Metadaten", und es gibt a Guter Beitrag von Brad Wilson hier .

    
danludwig 22.05.2012 21:40
quelle