it-swarm.com.de

MVC-Architektur - Wie viele Controller benötige ich?

Ich habe eine Weile programmiert, aber hauptsächlich Skripte und einfache Anwendungen. Ich bin in eine neue Rolle gewechselt, in der es darum geht, Web-Apps zu entwickeln und eine ordnungsgemäße MVC-Architektur zu verwenden. Deshalb versuche ich verzweifelt, sehr schnell etwas darüber zu lernen.

Ich hoffe, diese Frage ist " Best Practices für MVC Architecture " nicht allzu ähnlich, aber als ich einige verschiedene Tutorials durchlaufe, habe ich festgestellt, dass einige mehrere Controller für verschiedene Dinge haben.

Wie viele Controller benötigt eine einzelne Web-App?

Mir ist klar, dass dies ohne ein Beispiel schwer zu beantworten wäre, daher werde ich eines bereitstellen:

Anwendung:

  1. Benutzer meldet sich an.
  2. Der Benutzer kann eines von drei Dingen tun:
    a) Laden Sie eine Datei hoch (gespeichert in einer Mongodb-Datenbank mit Metadaten).
    b) Suche nach einer Datei.
    c) Abmelden.

Meine Frage ist allgemein gehalten, aber ich habe das Beispiel gegeben, um jedem zu helfen, der versucht zu antworten.

55
Jeff

Für Ihr Beispiel würde ich zwei Controller erstellen:

  • Sessions Controller für Login und Logout (Sitzung erstellen und zerstören für REST wie Layout)
  • Datei-Controller für alles in Dateien (Index = Suchen und Erstellen = Hochladen)

Im Allgemeinen gibt Ihnen ein RESTful-Ansatz, bei dem Sie alles als eine Ressource betrachten, die angezeigt, erstellt, bearbeitet und zerstört werden kann, eine gute Vorstellung davon, wie Sie Dinge strukturieren können. Wie Sie meinen Beispielen entnehmen können, halte ich mich nicht zu sehr an jedes einzelne Verb in REST.

Sie würden höchstwahrscheinlich mehr Controller für weitere Funktionen benötigen. Zum Beispiel ein Users Controller, mit dem Benutzer neue Konten erstellen können. Darüber hinaus benötigen Sie eine Administrationsoberfläche, über die Sie die Ressourcen mit höheren Berechtigungen bearbeiten können. In einem solchen Fall ist es durchaus üblich, dass fast jeder Controller dupliziert wird.

Eine sehr sehr grobe Schätzung, um eine erste Vorstellung zu bekommen, könnte ein Controller für jede Tabelle in Ihrer Datenbank sein, auf die Benutzer zugreifen können. Dies ist aber wirklich nur eine sehr grobe Messung.

34

Es kommt wirklich auf die Web-App an. In Ihrem Beispiel ist wahrscheinlich einer ausreichend. Wenn Sie eine vollständige E-Commerce-App mit Versand, Steuern, Bestandsverwaltung, Staffelpreisen usw. implementieren möchten, möchten Sie vielleicht noch ein paar mehr.

Wenn Ihr Controller unter einem oder mehreren Code riecht (insbesondere Large Class oder God Object ) leidet, wissen Sie, dass Sie wahrscheinlich den Punkt überschritten haben, an dem nur einer ausreicht.

6
Dan Pichelman

Es hängt wirklich von Ihren Anwendungsanforderungen und der Architektur der Geschäftsmodule ab.

Als allgemeine Faustregel hängt die Anzahl der erforderlichen Controller von einer Anzahl von Modulen und Untermodulen in der Web-App ab.

Als Ergänzung wäre es hilfreich, die Controller in Bereiche zu organisieren. Das Konzept von Areas ist in das ASP.NET MVC-Framework integriert und vereinfacht die Organisation von Controllern, die ein Modul bedienen.

Es gibt eine Reihe verwandter Diskussionen:

5
Yusubov

Ich mag Apples Art, es zu tun.

Jede Ansicht wird von nur einer Ansichtssteuerung gesteuert. ~ View Controller Programming Guide für iOS

Die Idee ist, dass Sie Ansichten problemlos austauschen können sollten. IMO, indem nur 1 Controller pro View vorhanden ist, ist es einfacher, dies zu erreichen. Ich bin mir jedoch sicher, dass Sie einen Controller mit mehreren Ansichten haben und ihn dennoch so gestalten können, dass Sie die Ansichten wechseln können, ohne die Programmlogik zu ändern.

4
Korey Hinton

Ein Beispiel, das mir gefällt, ist der Gedanke an einen Thermostat. Ein Thermostat eignet sich hervorragend zum Anzeigen des MVC-Musters.


Auf einem älteren analogen Thermostat können Sie sich Folgendes vorstellen:

Ansicht - Der Temperaturleser, der die aktuelle Temperatur anzeigt.

Controller - Das Einstellrad, mit dem Sie die Temperatur ändern

Modell - Die Teile im Inneren, die von der Steuerung aufgerufen werden und die eine Temperaturänderung bewirken.


Sie sollten sich immer an Entwürfe halten, die eine lose Kopplung ermöglichen und Modelle und die zugehörigen Steuerungen auf eine einzige Aufgabe beschränken. und Sie sollten so viele Module/Steuerungen verwenden, wie Sie benötigen . Abhängig von der Größe Ihrer Anwendung haben Sie möglicherweise weit weniger Ansichten als Modelle und Controller. Dies ist bei jeder großen Anwendung zu erwarten. Eine gute objektorientierte Programmierung zeichnet sich durch lose Kopplung, Kapselung, Vererbung und Polymorphismus aus. Nicht alle Sprachen unterstützen Polymorphismus in gleichem Maße (Funktion, Methode, Überladen/Überschreiben von Operatoren).

Wenn Sie ein besseres Verständnis für die ordnungsgemäße Verwendung der MVC-Architektur haben möchten, lesen Sie die GoF-Datei "Entwurfsmuster: Elemente wiederverwendbarer ... Software", die beispielsweise C++ und Smalltalk verwendet. Dieses Buch ist nicht das A und O, aber es ist sicherlich ein Anfang!

Viel Glück!

2
Charles Addis

Ich gehe davon aus, dass sich Ihr Beispiel zu einem komplexen System entwickeln wird.

Anwendung:

Benutzer meldet sich an :

  • LoginController

Es liegt in seiner alleinigen Verantwortung, die Anmeldungen zu bearbeiten, den Benutzer umzuleiten oder über das Ergebnis zu informieren.

Datei hochladen

  • UploadController

Ich gehe hier davon aus, dass Sie jede Art von Datei hochladen möchten. Wenn Sie sich zu einem späteren Zeitpunkt für das Hochladen von MP3s und PDFs entscheiden, hätte ich einen Basis-UploadController, MP3UploadController und PDFUploadController.

Suche nach einer Datei.

  • SearchFileController

Dies würde für eine Grundvoraussetzung ausreichen. Sie können zu einem späteren Zeitpunkt mehrere Suchsteuerungen verwenden, je nachdem, wie komplex die Suchlogik wird. Das Letzte, was Sie haben möchten, ist ein einzelner SearchController mit 20 Aktionsmethoden, die verschiedene Suchvorgänge ausführen.

Ausloggen.

- LogoutController.

Man könnte dies als Overkill betrachten, aber ich denke nicht, dass es so ist. Ich denke, es ist sauber und schön getrennt.

Wenn ich mir diese Projektstruktur ansehen würde, würde ich sofort wissen, was sie tut und wie sie strukturiert ist. Um noch einen Schritt weiter zu gehen, würde ich LoginController und LogoutController in einen separaten Bereich stellen.

Ich habe so etwas schon einmal entwickelt und es hat wirklich gut funktioniert.

1
CodeART

Der größte Teil Ihres Codes würde in einer Geschäftsschicht stattfinden, oder? Wenn dies der Fall ist, geben Sie in Ihrem Controller nur Daten an die Ansicht zurück.

Ich bin mir nicht sicher, ob ich es mag, die Controller in Subtypen zu unterteilen. Obwohl Sie die Trennung der Bedenken beibehalten sollten, denke ich, dass die Subtypen etwas zu weit gehen. Sie müssen auch in Fällen vorsichtig sein, in denen schwere Objekte im Konstruktor oder in einer Steuerung initialisiert werden. Beispiel: In Ihrem Beispiel möchten Sie ein schweres Objekt, das nur für die Freigabe von Such-/Upload-Dateien verwendet wird, wenn sich der Benutzer auf der Anmeldeseite befindet.

Es ist besser, einen Controller pro Logikeinheit zu haben, zum Beispiel AccountController (Anmelden, Registrieren, Abmelden), FileController (Suchen, Hochladen) und so weiter.

1
harsha

Im Allgemeinen kann man sagen, dass jedes MODELL seine eigenen CONTROLLER und dedizierten VIEWs hat. Mit "allgemein" meine ich, dass dies die beste Vorgehensweise ist.

anwendungsaspekte (wie die Benutzerverwaltung) sollten in den Anwendungsdienst übersetzt werden und müssen vom Controller selbst aufgerufen werden oder um Ihren Controller zu verpacken (unter Verwendung von Attributen, die die Controller-Funktionalität beispielsweise entsprechend der Anforderungsbenutzerrolle "sichtbar" machen).

Denken Sie daran, dass alle Controller CRUD-Operationen grundsätzlich über das Modell hinweg verarbeiten und unterschiedliche Ansichten für unterschiedliche Filter verwenden sollten.

Meiner Meinung nach ist einer der Hauptvorteile von MVC als Muster, dass es die beste Möglichkeit bietet, Modelle und Ansichten zu verknüpfen.

Zu dem Beispiel, das Sie hinzugefügt haben: Ich würde zwei Controller erstellen: einen für den Anmeldevorgang für alle Benutzer (Registrieren, Anmelden, Abmelden usw.) und den zweiten für Dateivorgänge (Hochladen und Suchen). Beachten Sie, dass der erste auch mit einem Aspekt in Bezug auf die Anmeldefunktion gesichert werden sollte und der zweite ein gewöhnlicher Controller ist

0