Wie wichtig ist es, eine Serviceschicht zu erstellen?

68

Ich habe angefangen, eine App in drei Ebenen (DAL, BL, UI) zu erstellen [hauptsächlich CRM, einige Verkaufsberichte und Inventar].

Ein Kollege sagte mir, dass ich zum Service-Layer-Muster übergehen muss, dass Entwickler aufgrund ihrer Erfahrung zum Service-Muster gekommen sind und es der bessere Ansatz ist, die meisten Anwendungen zu entwerfen. Er sagte, es sei viel einfacher, die Anwendung in Zukunft auf diese Weise zu warten.

Persönlich habe ich das Gefühl, dass es die Dinge nur komplexer macht, und ich konnte keinen großen Nutzen daraus ziehen, der das rechtfertigen würde.

Diese App verfügt über eine zusätzliche kleine Teil-Benutzeroberfläche, die einige (aber nur wenige) Funktionen der Desktop-Anwendung verwendet. Ich habe also festgestellt, dass ich etwas Code dupliziert habe (aber nicht viel). Nur wegen einiger Code-Duplikate würde ich es nicht in Service-orientiertes umwandeln, aber er sagte, ich sollte es trotzdem verwenden, weil es im Allgemeinen eine sehr gute Architektur ist, warum Programmierer so leidenschaftlich für Services sind?

Ich habe versucht, darauf zu googeln, aber ich bin immer noch verwirrt und kann mich nicht entscheiden, was ich tun soll.

BornToCode
quelle

Antworten:

58

In Martin Fowlers Buch "Patterns of Enterprise Architecture" heißt es:

Die einfachere Frage ist wahrscheinlich, wenn Sie sie nicht verwenden. Sie benötigen wahrscheinlich keinen Service Layer, wenn die Geschäftslogik Ihrer Anwendung nur eine Art von Client hat - beispielsweise eine Benutzeroberfläche - und die Antworten im Anwendungsfall nicht mehrere Transaktionsressourcen umfassen. [...]

Sobald Sie sich jedoch eine zweite Art von Client oder eine zweite Transaktionsressource in Use-Case-Antworten vorstellen, lohnt es sich, von Anfang an in einer Service-Schicht zu entwerfen.

Der Vorteil einer Service-Schicht besteht darin, dass sie einen gemeinsamen Satz von Anwendungsoperationen definiert, die für verschiedene Clients verfügbar sind, und die Reaktion bei jeder Operation koordiniert. Wenn Sie eine Anwendung haben, die über mehrere Arten von Clients verfügt, die ihre Geschäftslogik nutzen und komplexe Anwendungsfälle mit mehreren Transaktionsressourcen aufweisen, ist es sinnvoll, einen Service Layer mit verwalteten Transaktionen einzuschließen.

Mit CRM, Sales und Inventory wird es viele CRUD-Use-Cases geben, von denen es fast immer eine Eins-zu-eins-Korrespondenz mit Service-Layer-Vorgängen gibt. Die Reaktionen auf das Erstellen, Aktualisieren oder Löschen eines Domänenobjekts sollten von Service Layer-Vorgängen koordiniert und atomar abgewickelt werden.

Ein weiterer Vorteil eines Service Layers besteht darin, dass er für lokale oder Remote-Aufrufe oder für beides konzipiert werden kann - und Ihnen die Flexibilität bietet, dies zu tun. Das Muster legt die Grundlage für die gekapselte Implementierung der Geschäftslogik einer Anwendung und den konsistenten Aufruf dieser Logik durch verschiedene Clients. Dies bedeutet, dass Sie auch die Duplizierung von Code reduzieren / entfernen, da Ihre Clients dieselben gemeinsamen Dienste nutzen. Sie können möglicherweise auch die Wartungskosten senken. Wenn sich Ihre Geschäftslogik ändert, müssen Sie (im Allgemeinen) nur den Service und nicht jeden Client ändern.

Zusammenfassend lässt sich sagen, dass es gut ist, eine Service-Schicht zu verwenden. Ich denke, Sie haben in Ihrem Beispiel eine solche Schicht bereitgestellt, da es sich so anhört, als hätten Sie mehrere Kunden mit Geschäftslogik.

Deko
quelle
2
Interessanterweise plädiert Martin Fowler für dieselbe Schnittstelle für den lokalen und den Remote-Aufruf und argumentiert, dass der enorme Leistungsunterschied beim Remote-Aufruf eine grobkörnigere Schnittstelle erzwinge.
PSR
Ich habe Ihren Absatz nicht ganz verstanden With CRM, Sales and Inventory there will be a lot of CRUD-type use cases of which there is almost always a one-to-one correspondence with Service Layer operations- wenn es um mehrere Benutzeroberflächen geht, wie kommt die CRUD hier hinein? Und wenn ich nicht mehrere Benutzeroberflächen benötigen würde, obwohl die CRUD gut zu Diensten passt, würde ich immer noch keine Dienstebene erstellen, wenn ich das richtig verstehe Chaos zu meiner unerfahrenen Meinung)
BornToCode
4
In diesen Fällen ist es selten, dass es nur einen Kunden gibt, der davon profitieren kann. Wenn Sie nur eine Benutzeroberfläche hätten, könnte ich mir zwei Gründe vorstellen, aus denen Sie die Serviceschicht immer noch wünschen: Sicherheit und Wiederverwendbarkeit. In einem typischen Unternehmenssetup steht die UI-App externen Clients zur Verfügung und Ihre Service-Schicht ist nur im Netzwerk verfügbar. Der Webserver überträgt die Arbeit also auf einen gesperrten Teil Ihres Netzwerks. Im Verkaufsbeispiel können Sie wiederverwenden, wenn Sie Verkäufe von Ihrer Website übernehmen und auf eBay oder Amazon erweitern. Jetzt haben Sie eine Benutzeroberfläche und dennoch mehrere Clients.
Phil Patterson
5
Nur um den Kommentar von @PhilPatterson zu ergänzen. Mehrere Clients müssen nicht nur auf der Benutzeroberfläche basieren. Denken Sie an Webservices oder Bibliotheken - sie können auch Kunden sein. Ihre Front-End-Benutzeroberfläche verwendet möglicherweise die Service-Schicht sowie die von Ihnen gepackten Softwaredienste und lässt sie von einer anderen Person verwenden.
Deco
Können Sie ein Beispiel für einen Service-Layer angeben?
user962206
34

Hinzufügen einer Service-Schicht, weil Sie die Idee bewertet und den besten Ansatz gefunden haben: gut

Hinzufügen einer Serviceebene, weil all die coolen Kids das tun: schlecht

Wenn dein Bauch sagt, dass du keinen brauchst, dann mache keinen.

Eine der enttäuschendsten Entwicklungen in der Programmwelt in den letzten 10 Jahren ist, dass sie sich ärgerlich an der Mode orientiert und die Leute Trends und Bandwagons folgen, als wären sie Schuhe dieser Saison. Fallen Sie nicht in diese Falle. Denn in der nächsten Staffel wird dir "jeder" sagen, dass du es auf eine andere Art und Weise hätte gestalten sollen.

An einer Service-Schicht ist nichts falsch oder richtig - es handelt sich um einen bestimmten Ansatz, dessen Eignung in Bezug auf ihre technischen Vorzüge für das jeweilige Projekt bewertet werden sollte. Fühlen Sie sich nicht gezwungen, die Meinung anderer durch Ihr eigenes Urteilsvermögen zu ersetzen.

GroßmeisterB
quelle
27
Hiermit wird das Thema überhaupt nicht angesprochen, sondern es wird lediglich eine pauschale Erklärung über die Entwicklungspraktiken abgegeben, die nach Ersetzen einiger Wörter für nahezu jede Frage auf dieser Site gelten kann. Nach dem Lesen dieser Antwort bin ich nicht einmal davon überzeugt, dass Sie genau wissen, was eine Service-Schicht ist .
Aaronaught
12
Es kann sicherlich auf andere Fragen angewendet werden ... macht es nicht weniger wahr. Tatsache ist, dass weder Sie noch ich den notwendigen Kontext haben, um zu sagen, was er in seinem Projekt braucht. Ihm zu sagen, dass er ihn braucht oder nicht, ist nur eine Vermutung und unprofessionell. Was die OP hier braucht, ist ein bisschen moralische Unterstützung, um die Entscheidungen zu treffen, von denen er weiß, dass sie die richtigen sind.
GroßmeisterB
5
@Aaronaught Ungeachtet der Richtigkeit der Antwort beantwortet er im Wesentlichen immer noch die Hauptfrage: "Wie wichtig ist eine Serviceschicht?". Er behauptet überhaupt nicht wesentlich und dass es möglicherweise nur eine Modeerscheinung ist. Wenn Sie mit der Antwort nicht einverstanden sind, stimmen Sie bitte ab.
maple_shaft
2
@GrandmasterB Ich würde argumentieren, dass Moden in der Softwareentwicklung gut sind. Die meisten Entwickler sind zu frisch oder zu inkompetent, um fundierte Design- und Architekturentscheidungen zu treffen. Wir erwarten , dass sie immer noch , obwohl einen Anschein von Arbeits Software entpuppen, so sie auf einem fahrenden Zug aufspringen und ist konsistent mit einem schlechten Design Wahl weit preferrable ist und besser verwaltbar als die Art und Weise Dinge wurden vor getan Jahren , in denen wir würden auf alles Cowboy Code , den sie nicht verstanden oder geschätzt.
maple_shaft
10
@maple_shaft Nur um das zu verdeutlichen, ich sage nicht, dass Service Layer eine Modeerscheinung sind. Ich sage, basierend auf der Art und Weise, wie die Frage gestellt wurde, dass es den Anschein hat, als ob seine Kollegen ein scheußliches / Mode / Bandwagon- Verhalten zeigen , um ihn dazu zu bringen, eine Architektur zu verwenden, die seiner Meinung nach in seinem Projekt nicht gerechtfertigt ist. Ich mache in meiner Antwort deutlich, dass ich Service Layers (oder ein anderes Konzept) als genau das betrachte - neutrale Konzepte, deren Eignung für einzelne Projekte nach ihrem eigenen Verdienst bewertet werden sollte. Sie sollten nicht angewendet / verwendet werden, wenn das eigene Urteil sagt, dass sie nicht benötigt werden.
GroßmeisterB
22

Es gibt viele Faktoren, die bei der Entscheidung für die Erstellung einer Serviceschicht eine Rolle spielen. Ich habe in der Vergangenheit aus den folgenden Gründen Serviceschichten erstellt.

  1. Code, der von mehreren Clients wiederverwendet werden muss.
  2. Bibliotheken von Drittanbietern, für die wir eingeschränkte Lizenzen haben.
  3. Dritte, die einen Integrationspunkt in unser System benötigen.
  4. Zentralisierung duplizierter Geschäftslogik.

Fall 1: Sie erstellen eine Basisfunktionalität, die von einer Vielzahl verschiedener Clients verwendet werden muss. Die Serviceschicht enthält Funktionen, mit denen verschiedene Clients die von Ihnen bereitgestellten Funktionen sofort nutzen können.

Fall 2: Sie hosten normalerweise Code im App-Bereich, verwenden jedoch eine Drittanbieter-Bibliothek, für die Sie nur eingeschränkte Lizenzen haben. In diesem Fall haben Sie eine Ressource, die Sie überall verwenden möchten, aber nur eine begrenzte Anzahl von ihnen. Wenn Sie es hinter einem Service hosten, kann Ihre gesamte Organisation es von ihren Anwendungen nutzen, ohne für jedes einzelne Hosting eine Lizenz erwerben zu müssen.

Fall 3: Sie erstellen Funktionen für die Kommunikation mit Dritten. In Ihrem Beispiel könnten Sie einen Inventar-Endpunkt einrichten, damit Anbieter Ihnen Nachrichten über eingehende Produktsendungen übermitteln können.

Fall 4: Sie haben Ihren Code unternehmensweit analysiert und festgestellt, dass separate Teams dasselbe erstellt haben (nur geringfügig anders implementiert). Mit einer Serviceschicht können Sie die besten Ansätze auswählen und jetzt können Sie den Prozess für alle Teams gleich implementieren, indem sie den Service aufrufen. Ein weiterer Vorteil der Zentralisierung von Logik besteht darin, dass Fehler gefunden werden. Jetzt können Sie das Update einmalig bereitstellen und alle Clients können gleichzeitig den Vorteil nutzen.

Vor diesem Hintergrund gibt es potenzielle Nachteile für eine Serviceschicht.

  1. Fügt Systemkomplexität hinzu. Wo Sie zuvor nur eine Anwendung zum Debuggen hatten, haben Sie jetzt zwei. Produktionsprobleme erfordern die Überprüfung der Client-App-Einstellungen, Service-App-Einstellungen oder Kommunikationsprobleme zwischen ansonsten korrekt eingerichteten Client- und Server-Apps. Dies kann schwierig sein, wenn Sie es noch nie zuvor getan haben.
  2. Ein Punkt des Scheiterns. Wenn Sie einen Serviceausfall haben, sind alle Kunden betroffen. Wenn Code nicht auf diese Weise bereitgestellt wird, kann das Risiko geringer sein (es gibt jedoch Möglichkeiten, dies zu verringern).
  3. Die Versionierung kann schwieriger sein. Wenn Sie über eine App verfügen, die einen Service verwendet, können die Schnittstellenänderungen zwischen den beiden gleichzeitig durchgeführt werden. Wenn Sie jetzt mehrere Clients haben, müssen Sie verwalten, wer auf V1 und wer auf V2 ist, und das Entfernen von V1 koordinieren (sobald Sie wissen, dass alle auf V2 aktualisiert wurden).

Der wichtigste Punkt ist, dass es nicht immer ein Knaller ist, Ihr System serviceorientiert zu machen. Nach meiner Erfahrung ist es normalerweise eine gute Idee (ich neige dazu, Anwendungen auf diese Weise zu strukturieren), aber es ist keine automatische Entscheidung. Am Ende des Tages müssen Sie die Vor- und Nachteile abwägen und die Entscheidung treffen, die für Ihre Situation richtig ist.

Phil Patterson
quelle
2
+1 Danke für die informative Antwort. Ich hatte wirklich Zweifel, ob ich deine Antwort oder Decos Antwort akzeptieren konnte. Irgendwann, weil ich nicht zu erfahren bin, habe ich mich entschieden, die Antwort zu wählen, die die meisten positiven Stimmen bekommt. Ich bin immer noch der Meinung, dass Ihre Antwort mehr Gegenstimmen verdient. Auf jeden Fall weiß ich es wirklich zu schätzen, dass Sie Ihr Wissen und Ihre Erfahrung geteilt haben. Danke!
BornToCode
1
Herzlich willkommen! Der wichtigste Punkt, den Sie aus beiden Antworten herausnehmen sollten, ist, dass es (hauptsächlich) darum geht, Wartungsprobleme zu lösen, wenn mehrere Clients dasselbe tun müssen. Je mehr Kunden den Service nutzen, desto größer ist der Wartungsgewinn für Sie.
Phil Patterson
1
Es gibt auch Sicherheit - Service-Schichten können den Hackern eine weitere Sicherheitslücke bieten, um an den Schatz in der DB zu gelangen. Das Fehlen von Service-Layern ist möglicherweise der Grund dafür, dass so viele Websites große Sicherheitslücken aufweisen. Wenn sich ein Service in der Mitte befindet, erhalten die Hacker deutlich weniger Daten, bevor sie erkannt werden.
gbjbaanb
6

Die meisten Service-Layer, die ich gesehen habe, sind ein komplettes Durcheinander. Dienste haben in der Regel viele verschiedene Methoden, 1500 LOC sind keine Seltenheit. Die verschiedenen Methoden haben nichts gemeinsam, teilen aber Code. Dies führt zu einer hohen Kopplung und einer geringen Kohäsion . Dies verstößt auch gegen OCP , da Sie bei jeder neuen Operation den Code ändern müssen, anstatt die Codebasis zu erweitern. Eine gut aufgebaute Service-Schicht ist theoretisch möglich, aber ich habe sie in der Praxis nie gesehen.

CQRS löst diese Probleme und verhindert, dass Sie eine dieser prozeduralen Service-Ebenen erstellen müssen.

Jeroen
quelle
2
Gut gebaut nach wessen Maßstäben? Sicherlich ist eine Service-Layer-Schnittstelle nach OO-Standards ein komplettes Chaos. Aus funktionaler oder prozessualer Sicht fördert es einen schönen mehrschichtigen Designansatz. Ich denke, das größte Problem bei Service-Layern ist, dass sie eine statusfreie transaktionsbasierte Anwendung fördern und von einem rein objektorientierten Ansatz abraten. Ich kann beide Seiten des Arguments verstehen.
maple_shaft
6

Das Hinzufügen einer Schnittstelle (eine Serviceschicht ist eine Art von Schnittstelle) erfordert Zeit. Ein guter braucht viel Zeit zum Entwerfen und Testen. Es ist sehr wichtig, es beim ersten Versuch richtig zu machen, da eine spätere Änderung alle Clients zum Erliegen bringt. Bedenken Sie auch, dass Sie wahrscheinlich nicht wissen werden, was in dieser Schnittstelle sein muss, bis Sie einen zweiten Client mit leicht unterschiedlichen Anforderungen haben. Die Aufrechterhaltung eines Dienstes ist ein nie endendes Projekt für sich.

Wenn Sie sich in den meisten Organisationen an Ihren Geschäftspartner wenden und ihn fragen: "Möchten Sie, dass andere Abteilungen von diesem System, das wir mit Ihrem Budget entwickeln, profitieren (es wiederverwenden)?" Sie werden dich auslachen. Lassen Sie es zuerst für Ihren Geschäftssponsor arbeiten, und fangen Sie dann an, mit der Wiederverwendung dieses Codes herumzuspielen (in der Zeit Ihrer Abteilung).

Wenn Sie sicher sind, dass die Funktionalität, die Sie heute schreiben, von mehreren verschiedenen Service-Clients wiederverwendet wird, sollten Sie ab dem ersten Tag einen Service-Layer entwerfen. Wenn Sie sich nicht sicher sind oder bereits viele Unbekannte im Projekt vorhanden sind, sollten Sie zunächst eine einfache Aufgabe erledigen und sie später in Service und Client aufteilen, wenn Sie Zeit und Budget haben. Wenn Sie mit einem funktionierenden System beginnen, ist es viel einfacher, die Serviceschnittstelle gleich beim ersten Versuch zu finden.

PS Wenn Sie in Java arbeiten, hat Joshua Bloch in seinem Buch „Effective Java“ viele fantastische Ratschläge für die Benutzeroberfläche.

GlenPeterson
quelle
Eine großartige Antwort ohne sterile Theorien.
Danilo
2

Ich stimme mit Ihnen ein. Wenn Sie eine einzelne Benutzeroberfläche verwenden, müssen Sie keine weitere Ebene hinzufügen.

DAL, BL und UI / Controller sind eine gute Kombination zum Entwerfen einer Anwendung. Wenn Sie eine einzelne Benutzeroberfläche verwenden möchten, müssen Sie keine zusätzliche Ebene vorbereiten. Das Einfügen einer weiteren Schicht in die Anwendung erhöht nur den Entwicklungsaufwand / die Entwicklungszeit.

Eine weitere Möglichkeit besteht darin, mehrere Benutzeroberflächen in Ihrer Anwendung zu verwenden. In diesem Fall ist es hilfreich, über eine Service-Schicht zu verfügen, die die Benutzeroberflächen verwaltet.

Stapelüberlauf: Diskussion über das Service-Layer-Muster

Satish Pandey
quelle
Schlagen Sie also vor, dass ein Entwickler bei jeder komplexen Anwendung eine Serviceschicht verwenden und sich nicht nur mit DAL-, BL- und UI-Schichten begnügen sollte?
BornToCode
Bei mehreren Benutzeroberflächen müssen wir eine Serviceschicht einfügen. In Ihrem Fall glaube ich nicht, dass eine neue Ebene vorbereitet werden muss. Dies erhöht nur die Komplexität der Anwendung.
Satish Pandey
0

Ich würde bestreiten, dass Ihre BL Ihre Service-Schicht ist. Ein zentraler Ort, an dem sich Ihre Geschäftslogik befindet. Dies sollte eine DLL sein, die von allen verwendet werden kann, die diese Logik benötigen. Dann können Sie eine Web-API-Ebene darüber legen, wenn Ihre App andere Benutzeroberflächen hat.

user441521
quelle