Drei Fassungen der Wiedervorlage stehen jetzt in kladde-stile, und alle drei sind nach demselben Prinzip geschnitten: nach der technischen
Aufgabe eines Stücks Code. Fassung A trennt Präsentation, Geschäftslogik und Datenzugriff, B dazu Domäne und Anwendung, C Mitte und Adapter.
Die Änderung „wöchentlich“ ist in allen dreien quer hindurchgelaufen: vier Dateien in drei Schichten bei A, fünf in drei Projekten bei B, drei
in zwei Projekten bei C.
Lektion 4.10.1 hat den fünften Stil als Umkehrung beschrieben. Statt „welche technische Aufgabe hat dieser Code?“ fragt er „zu welcher Funktion gehört er?“. Diese Lektion baut die Wiedervorlage so, als Fassung D, misst sie wie die anderen und klärt die drei Fragen, an denen der Stil gelingt oder scheitert: Wie viel Duplikation ist erlaubt, wo bleiben die Regeln, und braucht es dafür eine Bibliothek?
Vertical Slice hat keine eigene Seite in Microsofts Dokumentation. Diese Lektion erklärt den Stil deshalb selbst. Wo Microsofts Leitfäden die Idee am Rand berühren, steht es dabei.
Nach Anwendungsfall schneiden
Ein Slice ist ein senkrechter Schnitt durch alle technischen Aufgaben eines Anwendungsfalls: der Endpunkt, der die Anfrage annimmt, die Logik, die entscheidet, und der Datenzugriff, der liest oder speichert. Alles davon liegt in einem Ordner, und jeder Anwendungsfall hat seinen eigenen. So sieht der Weg von „erledigen“ in den vier Fassungen aus:
| Fassung | Wo der Code für „erledigen“ liegt |
|---|---|
| A Schichten | ein Endpunkt in FollowUps.Web/FollowUpEndpoints.cs, FollowUpService.CompleteAsync in Business, FollowUpRepository in Data |
| B Clean | ein Endpunkt in Web, CompleteFollowUp in Application, EfFollowUpRepository in Infrastructure, FollowUp.Complete in Domain |
| C Hexagonal | ein Endpunkt in FollowUps.Http, FollowUpUseCases.CompleteAsync und FollowUp.Complete in Core, SqlFollowUpStore in Sql |
| D Slices | Features/CompleteFollowUp/CompleteFollowUpEndpoint.cs und FollowUp.Complete im Ordner Domain |
Dahinter steht dieselbe Frage wie hinter jedem Stil, aus Lektion 4.10.1: Was ändert sich zusammen? Die Schichten antworten „alles, was dieselbe Technik benutzt“. Slices antworten „alles, was zu einer Funktion gehört“. Kommt eine Funktion dazu, ist das ein neuer Ordner, und keine bestehende Datei muss sich öffnen. Ändert sich eine Funktion, bleibt die Änderung oft in ihrem Ordner.
Microsofts Leitfaden „Develop ASP.NET Core MVC apps“ (unter Weiterlesen) kennt die erste Hälfte dieser Idee unter den Namen Feature-Ordner oder Feature Slices: Code nach Funktion statt nach Art der Datei ordnen, für eine API ein Ordner je Funktion mit ihren Endpunkten und deren DTOs. Vertical Slice geht einen Schritt weiter und holt auch Logik und Datenzugriff in den Ordner.
Zwei Dinge folgen daraus, die Sie in den ersten drei Fassungen nicht hatten:
- Jeder Slice wählt seine Mittel selbst. Die Liste der fälligen braucht kein Aggregat, sie liest und zeigt. Ihr Slice fragt die Datenbank direkt und bildet das Ergebnis in derselben Abfrage auf die Antwort ab. Erledigen dagegen ändert etwas und lädt deshalb das Modell, lässt es entscheiden und speichert. Zwei Slices, zwei Wege, ohne dass einer den anderen stört.
- Es gibt keine Schicht, die alle teilen. Kein Dienst mit allen Methoden, kein Repository mit allen Abfragen. Was zwei Slices gemeinsam brauchen, muss sich das Recht dazu erst verdienen; dazu gleich mehr.