2013-09-05 6 views
11

Ich verwende DDD für den M-Teil meines MVC und nach einigen Recherchen (Studium!), Bin ich zu der Erkenntnis gekommen, dass ich meinen Controller mit Domain-Diensten (im Modell) interagieren muss. Dies würde meinen Controller zum Consumer der Domain-Services und damit zu einem Application-Service machen (DDD-bezogen). Ist das genau? Gibt es einen Unterschied zwischen einem Controller und dem, was DD als Anwendungsdienst definiert?Wird der Controller in MVC als Anwendungsdienst für DDD betrachtet?

Antwort

7

Der Controller wird in DDD nicht als Dienst betrachtet. Die Controller arbeiten in der UI-Ebene. Die Anwendungsdienste erhalten Daten von der Datenbank, validiert Daten, übergibt Daten an den Client (MVC könnte ein Client sein, aber auch eine Anfrage von einer Winforms-App) usw.

Die gesamte Steuerung erledigt Anfragen von der Benutzeroberfläche. Es ist nicht Teil der Anwendungsdomäne.

+0

Der Controller bedient Anfragen von der Ansicht, indem er die Anfrage - oder den relevanten Teil davon - an das Model weiterleitet. MVC ist eine Architektur und könnte definitiv sowohl auf Winforms als auch auf Web-Apps angewendet werden. Ich möchte mich hinsichtlich der Position des Controllers unterscheiden. Die View ist definitiv die einzige UI-Ebene und der Sinn von MVC besteht darin, diese UI-Ebene vom Controller getrennt zu halten. Dein Punkt ist aber gut gemacht; Danke für die Antwort. – Louis

+0

-1. Controller sind Anfragen/Kommandokoordinatoren.In einer hexagonalen Architektur befinden sich Controller oberhalb von Anwendungsdiensten/Kommando-Handlern/Query-Handlern. Controller ist ein Anforderungsübersetzer und ist mit dem Kommunikationsprotokoll (obere Schicht) und den Befehls-/Abfrage-Handlern (Anwendungsdienste von einer niedrigeren Ebene) gekoppelt. Controller können als Anwendungsdienst-Fassaden betrachtet werden, da sie den Befehl/die Abfrage/die Nachricht, die von den unteren Ebenen (Anwendungsdienst-/Befehlsabfrage-Handler) verarbeitet werden sollen, übersetzen und vorbereiten. – Tudor

+0

-1 weil Controller nichts mit DDD zu tun haben. Es ist irrelevant, wo Sie die Controller setzen, könnten Sie sagen, die Controller sind nur Nachrichten/Kommunikation Koordinatoren und sie sind in beide Richtungen gekoppelt: ui und Application Service. Sie könnten Controller in einem beschränkten Kontext haben, in dem es keine Benutzeroberfläche gibt (ein reiner Befehlskontext). Und Sie könnten einen beschränkten Kontext nur für die Präsentation haben (eine zusammengesetzte Geschäftskomponente, die nur für die Abfrage von 2 oder mehr beschränkten Kontexten erstellt wurde). P.S. Controller haben eine geringe Kopplung an die Benutzeroberfläche, sie erwarten nur eine Reihe von Anforderungsparametern, egal von wo. – Tudor

1

Eine Layered Architecture teilt die Anwendung in UI-Layer, App-Layer, Domain Layer und Infrastructure Layer auf (Vaugn Vernons implementiert domänengesteuertes Design (Position 2901)). Der Controller fällt in die "Anwendungsschicht" dieser breiteren Designarchitektur und interagiert daher direkt mit den Domänendiensten im Modell und wird als Anwendungsdienst betrachtet. Nicht nur das, es wird natürlich auch die Entitäten und Aggregate als verfügbar verwenden.

+4

Wenn Sie auf PG schauen. 72 von Evans DDD sehen Sie, dass Abbildung 4.1 den Controller als Teil der UI-Ebene zeigt. Und das macht Sinn, denn wenn V und C in getrennten Schichten wären, hätten Sie eine innige Kopplung zwischen ihnen, wenn die Schichten nur durch Indirektion und Schnittstellen verbunden werden sollten. – Gordon

+1

@Louis, ich habe Vaugn Vernons Buch nicht gelesen, aber ich bin gerade von einem erfolgreichen DDD Projekt gekommen. Alles was ich sagen kann ist, dass die Controller in einem komplett separaten Projekt, dem Client-Projekt, waren. Der Kunde war in unserem Fall ein MVC-Frontend. Es könnte jeder andere Kunde gewesen sein. Die Anwendungsebene war ein völlig separates Projekt, das auf eigenen Füßen stand. Es hatte seine eigenen Validatoren und konnte Daten über eine WCF-Schnittstelle liefern. Die Controller im MVC-Client haben lediglich die Proxy-Methoden der Anwendungsschicht aufgerufen. Ansonsten haben sie keine andere Funktion erfüllt. – Greg

+0

@ Gordon V und C können durch passive Ansichten oder überwachende Controller entkoppelt werden. Für einige Anwendungen ist das Koppeln nicht unbedingt eine schlechte Idee. Es hängt sehr stark von den Besonderheiten der zu entwickelnden Anwendung ab. Angesichts Ihrer Bezugnahme auf Seite 72 von Evans werde ich meine Antwort zurückziehen, da es scheint, dass es andere Ansätze gibt, die sich von meinen unterscheiden. Danke für die Antwort. Ich wünschte, wir könnten in eine gute Diskussion über SO kommen, ohne dass das Risiko besteht, dass die Frage als nicht konstruktiv abgeschlossen wird;) – Louis

0

Die Anwendungsschicht befindet sich irgendwo zwischen der Domänenebene und der Präsentationsschicht. Der Controller ist Teil der Präsentationsschicht und sendet Befehle oder Abfragen an die Anwendungsschicht, auf der die Anwendungsdienste sie mithilfe der Dienste und Objekte des Domänenmodells ausführen. So unterscheiden sich die Controller von den Anwendungsdiensten, und sie sind wahrscheinlich an das tatsächliche Kommunikationsformular gebunden, z. HTTP. Sie sollten Domänen-Services nicht direkt von Controllern aus aufrufen. Dies könnte ein Zeichen für falsch platzierten Code sein.

Domain Driven Design: Domain Service, Application Service

  • Domain Services: Fasst Business-Logik, die nicht natürlich innerhalb einer Domäne Objekt passt, und sind nicht typisch CRUD-Operationen - zu einem Repository gehören jene würden.
  • Anwendungsdienste: Wird von externen Benutzern verwendet, um mit Ihrem System zu sprechen (denken Sie an Webdienste). Wenn Verbraucher Zugriff auf CRUD Operationen benötigen, würden sie hier ausgesetzt werden.

So ist Ihr Service wahrscheinlich ein Application Service und kein Domain-Service, oder ein Teil App Services, Service einige Teilfläche. Sie sollten Ihren Code überprüfen und umgestalten. Ich denke, nach 4 Jahren ist das egal, aber ich hatte die gleichen Gedanken bei einer Anwendung, die ich gerade entwickle. Diese App ist möglicherweise zu klein, um DDD darauf zu verwenden. Verwirrende Controller mit App-Services sind hier ein Zeichen für Overengineering.

Es ist eine interessante Frage, wenn Sie beginnen, weitere Schichten hinzuzufügen. Ich denke, jede App sollte mit einer Art von domain model and adapters starten, um eine Verbindung zu diesem Domänenmodell herzustellen. Wenn die App einfach genug ist, ist das Hinzufügen von mehr als zwei Ebenen möglicherweise nicht notwendig. Aber das ist nur ein Gedanke, ich bin nicht so erfahren mit DDD.

Verwandte Themen