MVCS - Model View Controller Service

70

Ich benutze MVC schon lange und habe von der " Service " -Schicht gehört (zum Beispiel in einem Java-Webprojekt). Ich habe mich gefragt, ob dies ein echtes Architekturmuster ist, da ich nicht viele Informationen darüber finden kann es.

Die Idee von MVCS besteht darin, eine Serviceschicht zwischen dem Controller und dem Modell zu haben , um die gesamte Geschäftslogik zu kapseln, die sich im Controller befinden könnte. Auf diese Weise sind die Controller nur dazu da, die Ausführung weiterzuleiten und zu steuern. Und Sie können einen Dienst in vielen Controllern (z. B. einer Website und einem Webservice) aufrufen, ohne den Code zu duplizieren.

Matthieu Napoli
quelle
2
"Ich habe mich gefragt, ob das ein echtes Architekturmuster ist" ... nun, nicht mehr oder weniger real als andere Designmuster :) Es geht darum, die Abstraktion auszuwählen, die am sinnvollsten ist - in diesem Fall scheint MVCS Seien Sie eine nützlichere Abstraktion als MVC, wenn Sie mit einer Vielzahl von Upstream-Datenquellen (Datenbankmodellen, anderen Webdiensten usw.) arbeiten, und insbesondere dann, wenn Sie darüber nachdenken, IHRE Arbeit als Dienst verfügbar zu machen. Dieses Muster hat mir geholfen, viel Code wiederzuverwenden, als ich eine Web-App hatte, die ich später als REST-API verfügbar machte.
Joe

Antworten:

89

Die Service-Schicht kann auf viele Arten interpretiert werden, aber normalerweise haben Sie dort Ihre Kerngeschäftsverarbeitungslogik und befinden sich unter Ihrer MVC-Architektur, aber über Ihrer Datenzugriffsarchitektur.

Beispielsweise kann Ihre Schicht eines vollständigen Systems folgendermaßen aussehen:

  1. Ansichtsebene: Ihr MVC-Framework und Code Ihrer Wahl
  2. Service-Schicht: Ihr Controller ruft die Objekte dieser Schicht auf, um Modelle oder andere Anforderungen abzurufen oder zu aktualisieren.
  3. Datenzugriffsobjekte: Dies sind Abstraktionen, die Ihre Service-Schicht aufruft, um die benötigten Daten abzurufen / zu aktualisieren. Diese Schicht ruft im Allgemeinen entweder eine Datenbank oder ein anderes System auf (z. B. LDAP-Server, Webdienst oder DB vom Typ NoSql).

Die Serviceschicht wäre dann verantwortlich für:

  • Abrufen und Erstellen Ihres "Modells" aus verschiedenen Datenquellen (oder Datenzugriffsobjekten).
  • Aktualisieren von Werten in verschiedenen Repositorys / Ressourcen.
  • Durchführen von anwendungsspezifischer Logik und Manipulationen usw.

Das Modell, das Sie in Ihrer MVC verwenden, kann von Ihren Diensten stammen oder nicht. Möglicherweise möchten Sie die Ergebnisse, die Ihnen Ihr Service liefert, in ein Modell umwandeln, das spezifischer für Ihr Medium ist (z. B. eine Webseite).

Clinton
quelle
1
Normalerweise benutze ich Dienste für den externen Zugriff. Während MVC meine gesamte app-spezifische Logik enthält, verwende ich für alle externen Aufrufe anderer Systeme so etwas wie DBService oder FacebookOAuthService. Wenn Sie eine Drittanbieter-Bibliothek einpacken, anstatt sie eng zu integrieren, können Sie die Bibliotheken einfacher austauschen. Für mich war es sehr sinnvoll, über solche Dienstleistungen nachzudenken.
Lex
Um dies hinzuzufügen, ist Ihr Modell aus der Services-Ebene eher ein Datenübertragungsobjekt. Dies kann direkt in etwas übersetzt werden, das die Anforderungen der Ansicht direkt
erfüllt
Dies klingt so, als wäre es nur MVC, aber mit einer zusätzlichen Fassade, um den Controller sauber zu halten.
David
13

Ich hatte selbst über dieses Muster nachgedacht, ohne irgendwo anders einen Hinweis darauf zu sehen, und Google durchsucht und Ihre Frage hier gefunden :)

Selbst heute gibt es nicht viel, über das jemand spricht oder schreibt

View-Controller-Servicemuster.

Geben Sie hier die Bildbeschreibung ein

Ich wollte Sie wissen lassen, dass andere das Gleiche denken, und das Bild oben zeigt, wie ich es sehen sollte.

Derzeit verwende ich es in einem Projekt, an dem ich gerade arbeite.

Ich habe es in Modulen mit jeder Ebene im Bild oben mit einem eigenen Modul.

Geben Sie hier die Bildbeschreibung ein

Die Serviceschicht ist der "Konnektor", "Vermittler", "serverseitiger Controller", was der "clientseitige" Controller für den Client und der "Service" für den Server tut.

Mit anderen Worten, der clientseitige "Controller" "kommuniziert" nur mit dem "Service", auch bekannt als serverseitiger Controller.

Controller ---> Anforderungen und Empfang von der <----- Service-Schicht

Die Service-Schicht ruft Informationen ab oder gibt Informationen an die Schichten auf der Serverseite weiter, die sie benötigen.

Der Dienst selbst macht nichts anderes, als die Serverschichten mit dem zu verbinden, was sie benötigen.

Hier ist ein Codebeispiel:

Geben Sie hier die Bildbeschreibung ein

Kbdavis07
quelle
Das einzige Problem, das ich mit diesem Architekturstil habe, ist die Annahme, dass die DataModels dieselbe "Form" haben wie die Anforderungen für die "Ansicht". Wenn sie 1 zu 1 oder in der Nähe sind, wo Sie ein paar Eigenschaften speziell für die Ansicht stören könnten, ist es in Ordnung, aber viel Zeit werden die DataModels aus einer Speicherperspektive entworfen, und ein ViewModel wird aus einer Perspektive entworfen Ansichten Perspektive.
Hanzolo
Es gibt "DataModels" und "ViewModels", die oben gezeigte Grafik wurde schnell und schlecht gemacht :)
Kbdavis07