Frage

Derik Whitaker veröffentlichte ein Artikel ein paar Tage her, dass ein Punkt getroffen, die ich neugierig war etwa seit einiger Zeit: sollte vorhanden sein Business-Logik in Controller

?

Bisher alle ASP.NET MVC Demos Ich habe Zugriff auf das Repository und Business-Logik in der Steuerung gesehen habe. Einige haben sogar die Validierung in dort werfen auch. Dies führt zu einem ziemlich großen, aufgeblähten Controller. Ist das wirklich der Weg, um den MVC-Framework zu verwenden? Es scheint, dass dies geht nur mit vielen duplizierten Code am Ende und Logik über verschiedene Controller verteilt.

War es hilfreich?

Lösung

Die Geschäftslogik sollte wirklich im Modell sein. Sie sollten für das Fett Modelle, dünn Controller Ziel sein.

Zum Beispiel, anstelle von:

public interface IOrderService{
    int CalculateTotal(Order order);
}

Ich habe lieber:

public class Order{
    int CalculateTotal(ITaxService service){...}        
}

Dies setzt voraus, dass die Steuer von einem externen Dienstleister berechnen ist, und erfordert Ihr Modell über Schnittstellen zu externen Dienstleistungen zu kennen.

Dies würde Ihre Controller Blick etwas wie machen:

public class OrdersController{
    public OrdersController(ITaxService taxService, IOrdersRepository ordersRepository){...}

    public void Show(int id){
        ViewData["OrderTotal"] = ordersRepository.LoadOrder(id).CalculateTotal(taxService);
    }
}

oder so ähnlich.

Andere Tipps

Ich mag das Diagramm dargestellt von Microsoft Patterns & Practices . Und ich glaube an das Sprichwort ‚Ein Bild sagt mehr als tausend Worte‘.

Das Diagramm zeigt Architektur von MVC und Business-Sevices Schichten

Dies ist eine faszinierende Frage.

Ich denke, dass seine interessant, dass eine große Anzahl von Proben MVC-Anwendungen tatsächlich nicht dem MVC-Paradigma im Sinne wirklich Platzierung der „Business-Logik“ vollständig im Modell folgen. Martin Fowler hat darauf hingewiesen, dass MVC kein Muster im Sinne des Ganges Of Four ist. Vielmehr ist es Paradigma, das der Programmierer Muster muß hinzufügen , wenn sie etwas über ein Spielzeug App erstellen.

So die kurze Antwort ist, dass „Business-Logik“ sollte in der Tat nicht in der Steuerung leben, da die Steuerung die zusätzliche Funktion des Umgangs mit der Sicht und Benutzer-Interaktionen hat, und wir wollen Objekte mit nur einem Zweck schaffen.

Eine längere Antwort ist, dass Sie einige Gedanken in das Design des Modells Schicht setzen müssen, bevor nur Logik von Controller-Modell zu bewegen. Vielleicht können Sie alle app Logik behandeln REST verwenden, wobei in diesem Fall das Design des Modells ziemlich klar sein sollte. Wenn nicht, sollten Sie wissen, was nähern Sie Ihr Modell aufgebläht zu halten verwenden werden davor.

Sie können dieses tolle Tutorial von Stephen Walther überprüfen, ob Shows Validieren mit einem Service Layer .

  

Erfahren Sie, wie Sie Ihre Validierung bewegen   Logik aus Ihren Controller-Aktionen   und in eine separate Service-Schicht. Im   dieses Tutorial, Stephen Walther   erklärt, wie Sie eine scharfe halten kann   Trennung von Bereichen durch Isolieren   Ihr Service-Layer von Ihrem   Steuerungsschicht.

Business-Logik sollte nicht in Controllern enthalten sein. Controller sollte so dünn wie möglich sein, im Idealfall das Prasseln wie folgt vor:

  1. Finden Domäne Entität
  2. Gesetz über die Domain-Einheit
  3. Bereiten Sie Daten für view / Rückkehr Ergebnisse

Zusätzlich kann Controller einig Anwendungslogik enthalten.

Also, wo platziere ich meine Business-Logik? Im Modell.

Was ist das Modell? Nun, das ist eine gute Frage. Bitte finden Sie unter Microsoft Patterns and Practices Artikeln (ein dickes Lob an AlejandroR für ausgezeichneten Fund). Hier gibt es drei Kategorien von Modellen:

  • Modell . Das ist einfach eine Datum Tasche, mit minimal, wenn überhaupt, logischen Daten, um von und zu Ansichten, enthält grundlegende Feldvalidierung
  • Domain Model : Fat-Modell mit Business-Logik, arbeitet auf einem einzelnen oder mehreren Dateneinheiten (das heißt Einheit A in einem bestimmten Zustand als Aktion auf Entität B)
  • Datenmodell : Speicher-aware-Modell, Logik innerhalb einer einzigen Einheit enthaltenen Informationen beziehen sich nur auf diese Entität (das heißt, wenn das Feld ein Feld dann b)

Natürlich MVC ist ein Paradigma, das in verschiedenen Sorten kommt. Was ich beschreibe hier ist MVC nur obere Schicht besetzen, vide dieser Artikel auf Wikipedia

  

Heute MVC und ähnliche Model-View-Presenter (MVP) sind Separation of Concerns Entwurfsmuster, die sich ausschließlich auf die Präsentationsschicht eines größeren Systems gelten. In einfachen Szenarien kann MVC die primäre Design eines Systems darstellen, direkt in die Datenbank gelangen; in den meisten Szenarien haben jedoch der Controller und Modell in MVC eine lose Abhängigkeit von einem Dienst oder eine Datenschicht / Tiere. Das ist alles über Client-Server-Architektur

Wenn u Abhängigkeit verwenden Injectors Ihre Geschäftslogik zu ihnen gehen und damit werden Sie ordentlich und sauber Controller erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top