Präsentation VS Anwendungsschicht in DDD

9

Ich habe Probleme, eine klare Linie zwischen Präsentations- und Anwendungsschicht in Domain Driven Design zu ziehen.

Wohin sollen Controller, Ansichten, Layouts, Javascript- und CSS-Dateien gehen?

Befindet es sich in der Anwendung oder in der Präsentationsschicht?

Und wenn sie alle zusammen in derselben Schicht liegen, was enthält die andere? Ist es leer

Matthieu Napoli
quelle

Antworten:

7

Nur weil jemand "Application Layer" und "Presentation Layer" erstellt und benannt hat, heißt das nicht, dass Ihre Anwendung sie haben sollte. Sie sollten Ebenen erstellen, nachdem Sie eine erhebliche Menge an Code erstellt haben, den Sie zusammen gruppiert haben, und diese Gruppe aus Gründen der Kommunikation zwischen Entwicklern und der Klarheit des Codes benennen möchten.

Ab DDD. Die Anwendungsschicht ist alles, was keine Domänenschicht ist. Dazu gehören Anwendungslogik, Präsentations- und Anwendungsdienste.

Euphorisch
quelle
2
Vielen Dank, in der Tat haben Sie mir klar gemacht, dass es für meinen Fall nutzlos ist, Anwendung und Präsentation zu trennen. Einfachheit zuerst!
Matthieu Napoli
Wenn DDD eine REST-API anstelle einer Benutzeroberfläche in der Präsentationsschicht hat, wäre die REST-API eine Anwendungs- oder Präsentationsschicht. Ich bin jetzt verwirrt, da ich sicher war, dass die REST-API eine Präsentationsschicht ist.
Dario Granich
8
Tatsächlich schreibt DDD vier Schichten in der folgenden Reihenfolge vor, von höher nach niedriger: Präsentation, Anwendung, Domäne, Infrastruktur. Die Anwendungsschicht enthält also keine "Präsentation". Es ist auch immer eine gute Idee, sich für die Ebenen zu entscheiden, bevor eine erhebliche Menge Code geschrieben wird, da es nicht nur darum geht, Code zu gruppieren, sondern auch die Richtung der Abhängigkeiten zur Kompilierungszeit einzuschränken.
Rogério
11

Aus DDD-Sicht gibt es einen großen Unterschied zwischen der Anwendungsschicht und der Präsentationsschicht.

Obwohl sich DDD darauf konzentriert, wie die Domäne mithilfe der DDD-Bausteine ​​und -Konzepte wie begrenzte Kontexte, allgegenwärtige Sprache usw. modelliert wird, ist es dennoch wichtig, die verschiedenen Ebenen in Ihrer App klar zu identifizieren und zu trennen.

Die Architektur spielt eine große Rolle bei der Implementierung einer erfolgreichen DDD-App. Eine berühmte Architektur, die in letzter Zeit viel Aufsehen erregt hat, ist die Zwiebelarchitektur:

Geben Sie hier die Bildbeschreibung ein

In diesem Design sind die UI / Präsentationsschicht und die Anwendungsschicht klar voneinander getrennt. Das Zusammenführen der beiden führt zu einer engen Kopplung zwischen zwei Schichten, die klare getrennte Bedenken und Verantwortlichkeiten haben.

Die Präsentationsebene sollte nur die Präsentationslogik enthalten. Vermeiden Sie intelligente Benutzeroberflächen, die zu viel wissen. Hier befinden sich neben CSS, JS, Vorlagen, Formularen und allem, was sich auf Antwort- und Anforderungsobjekte bezieht, hauptsächlich die Controller und Ansichten der MVC.

Die durch die Präsentation ausgegebenen Aktionen werden über Befehle an die Anwendungsschicht delegiert. Die Anwendungsschicht enthält die Anwendungslogik. Normalerweise wird es einem Anwendungsfall zugeordnet. Es enthält, WAS das System tun sollte, um einen Anwendungsfall zu erfüllen. Ein typischer Anwendungsdienst fordert ein Repository auf, ein Aggregat zurückzugeben, und ruft dann eine Aktion für dieses Aggregat auf.

Schauen Sie sich das Beispielprojekt von Vaughn Vernons IDDD an

Songo
quelle
2
+1. So habe ich mein Projekt umgesetzt. Auf diese Weise konnte ich sofort Gewinne erzielen. Da ich zu einer Anwendungsebene abstrahiert habe, konnte ich mehrere Präsentationsebenen haben. Zum Beispiel verbrauchen sowohl unsere Web-API als auch unsere Website die Anwendungsschicht, was viel Zeit und doppelten Code spart, da meine Web-App keine Nachrichten an die und von der Web-API rahmen muss und die gesamte Logik synchron bleibt zwischen den beiden.
Sinaesthetic
Wo sind entry pointund composition rootplatziert? Ich dachte immer, es sei eine Verantwortung der ApplicationSchicht. Aber jetzt sieht es so aus, als wäre dies eine PresentationSchicht.
Denis535
2

Domain Driven Design hat weder mit der Präsentationsschicht noch mit der Anwendungsschicht etwas zu tun. DDD ist eine Methode, deren Hauptaugenmerk auf der Domänenschicht liegt. Das heißt, DDD legt keine Einschränkungen in Bezug auf eine andere Ebene außer der Domänenebene fest, und Ihre Frage könnte auch im Kontext einer anderen Methodik gestellt werden.

Abgesehen davon ist es sehr üblich, eine vierschichtige Architektur für DDD-Anwendungen zu verwenden. Hier ist ein Beispiel für eine solche Anwendung, die die Ebenen und ihre beabsichtigte Verwendung zeigt: DDDSample Architecture . Wenn Sie diese Architektur verwenden, werden Ihre Ansichten und Layouts auf die Ebene "Schnittstellen" und die Controller, sofern sie von der Schnittstelle unabhängig sind, auf die Ebene "Anwendung" verschoben.

Sie können auch eine andere Art von Architektur wählen, da DDD keine Einschränkungen auferlegt. Es gibt viele MVC-Frameworks, die unterschiedliche Strukturen haben und dennoch auch für DDD-Anwendungen verwendet werden können. Dann würden Sie natürlich Ihre Ansichten und Layouts entsprechend platzieren.

zafarkhaja
quelle