MVC Design Pattern, Service Layer Zweck?

8

Nehmen wir an, ich habe ein folgendes Repomuster:

%Vor%

dann in meinem Controller:

%Vor%

Grundsätzlich ist mein Muster etwas wie

View <-> Controller -> Repo -> EF -> SQL Server

aber ich habe viele Leute gesehen, die das gemacht haben

View <-> Controller -> Service -> Repo -> EF -> SQL Server

Meine Frage ist also:

  1. Warum und wann brauche ich service layer ? Fügen Sie nicht einfach einen weiteren unnötigen Layer hinzu, weil jede nicht-generische Methode bereits in ICustRepo ?

  2. implementiert ist?
  3. Sollte die Serviceebene DTO oder my ViewModel zurückgeben?

  4. Sollte die Serviceebene 1: 1 mit meinem Repo abbilden?

Ich habe mich ein paar Tage umgesehen, aber ich bin nicht mit den Antworten zufrieden.

Jede Hilfe wird geschätzt und entschuldigt sich für schlechtes Englisch.

Danke.

UPDATE:

Unterschied zwischen Repository und Service-Layer?

Ich habe das schon gelesen. Ich kenne den Unterschied zwischen diesen beiden schon, aber ich möchte wissen warum und warum. Also das beantwortet meine Frage nicht

    
warheat1990 02.07.2015, 09:30
quelle

2 Antworten

9

TL; DR

  1. Siehe Erläuterung unten
  2. Layer über Service Layer sollten sich nicht bewusst sein, dass mehr Layer unter Service Layer vorhanden sind.
  3. Nicht unbedingt, weil Sie zum Beispiel Daten von 1 Typ über 2 Tabellen verstreut haben und der "Core" nur eins, der Datenzugriffsschicht ist verantwortlich für "Gruppierung" und die Rückgabe des Service-Schichttyps

Erläuterung

Die typische 3-Schichten-Architektur besteht aus Präsentationsschicht, Service / Domänenschicht, Datenzugriffsebene (DAL).

Stellen Sie sich die Service-Schicht als "Kern" Ihrer Anwendung vor. Tipisch hat Service Layer nur Repository-Schnittstellen, die in der DAL implementiert werden.

Dadurch können Sie "einfach" den Zugriff auf Daten ändern. Die von der Service-Schicht zurückgegebenen Objekte sollten keine DAO-Objekte sein, da die Präsentations-Ebene nicht einmal "weiß", dass die DAL existiert.

Szenario: Sie haben eine 3-stufige Lösung. Derzeit macht es nicht viel Sinn, alle Ebenen zu haben.

%Vor%

Jetzt möchten Sie eine REST API in ASP.NET MVC WebApi haben

%Vor%

Nun möchten Sie beispielsweise Entity Framework nicht mehr als Datenzugriff verwenden und NHibernate verwenden.

%Vor%

Beachten Sie, dass wir eine neue Form der Präsentation hinzugefügt haben und die Art, wie wir auf Daten zugreifen, geändert haben, aber die Service-Schicht hat sich nie geändert.

Tipischerweise stellt Service Layer Schnittstellen bereit, die in der Datenzugriffsebene implementiert werden, damit wir die gewünschte "Abstraktion" erhalten.

Ich habe ein Projekt mit dieser Architektur in der Universität realisiert. Sie können den Code HIER

sehen

Ich hoffe, das hat geholfen. Tut mir leid, wenn ich so langweilig bin @ erklären Dinge: P

    
Driver 02.07.2015, 10:42
quelle
0

Ad.1 Service-Schicht sollte Platz für die gesamte Geschäftslogik sein. Es geht mehr um getrennte Verantwortlichkeiten:

  • Controller - verantwortlich für die Vorbereitung von viewModel und Übergabe an die spezifische Ansicht,

  • Repository - abstrakte Ebene, die für das Sammeln von Entitäten aus der Datenbank verantwortlich ist

  • Service - verantwortlich für komplexe Logik. Es gibt oft Fälle, in denen der Dienst viele Entitäten verwendet, um Logik zu erzeugen und nur DTO zurückzugeben.

Ad.2 Meiner Meinung nach sollte Service-Layer DTO-Objekte zurückgeben, die den View-Modellen in Controllern zugeordnet werden sollten.

Ad.3 Nein, das ist nicht der Fall. In Ihrem Beispiel können Sie GetBadCust und GetGoodCust von Repo in den Service verschieben und einige DTO zurückgeben

    
Piotr Czarnecki 02.07.2015 09:42
quelle