oqtane-general-description #62

Merged
Kocoder merged 17 commits from oqtane-general-description into main 2026-03-02 11:33:12 +00:00
Showing only changes of commit 8f30e063ce - Show all commits

View File

@@ -49,13 +49,13 @@ architecture-beta
## Dependency injection
Review

Großschreibung: 'injection' -> 'Injection'.

## Dependency Injection
Großschreibung: 'injection' -> 'Injection'. ```suggestion ## Dependency Injection ```
### Dependency Inversion Principle [^1]
Das Dependency-Inversion-Principle (DIP / auf Deutsch: Abhängigkeits-Umkehr-Prinzip) ist eines von den 5 `SOLID` Prinzipien in der Softwareentwicklung.
Das Dependency-Inversion-Principle (DIP / auf Deutsch: Abhängigkeits-Umkehr-Prinzip) ist eines von den fünf `SOLID` Prinzipien in der Softwareentwicklung.
Kocoder marked this conversation as resolved Outdated

Zahlen von eins bis zwölf werden im Fließtext üblicherweise ausgeschrieben.

Das Dependency-Inversion-Principle (DIP / auf Deutsch: Abhängigkeitsumkehrprinzip) ist eines von den fünf `SOLID` Prinzipien in der Softwareentwicklung.
Zahlen von eins bis zwölf werden im Fließtext üblicherweise ausgeschrieben. ```suggestion Das Dependency-Inversion-Principle (DIP / auf Deutsch: Abhängigkeitsumkehrprinzip) ist eines von den fünf `SOLID` Prinzipien in der Softwareentwicklung. ```
Review

Grammatik: 'von den fünf' -> 'der fünf' (Genitiv ist stilistisch besser).

Das Dependency-Inversion-Prinzip (DIP / auf Deutsch: Abhängigkeits-Umkehr-Prinzip) ist eines der fünf `SOLID`-Prinzipien in der Softwareentwicklung.
Grammatik: 'von den fünf' -> 'der fünf' (Genitiv ist stilistisch besser). ```suggestion Das Dependency-Inversion-Prinzip (DIP / auf Deutsch: Abhängigkeits-Umkehr-Prinzip) ist eines der fünf `SOLID`-Prinzipien in der Softwareentwicklung. ```
Das DIP unterscheidet zwischen high-level und low-level Modulen.
Review

Großschreibung: Im Deutschen werden Adjektive in Titeln/Eigennamen wie 'High-Level' großgeschrieben.

Das DIP unterscheidet zwischen High-Level- und Low-Level-Modulen.
Großschreibung: Im Deutschen werden Adjektive in Titeln/Eigennamen wie 'High-Level' großgeschrieben. ```suggestion Das DIP unterscheidet zwischen High-Level- und Low-Level-Modulen. ```
- Die high-level Module beschreiben die Applikations- / Buisnesslogik, ohne direkt mit den low-level Modulen zu interagieren, sondern lediglich auf abstraktionen. [^3]
- Die Abstraktionen sollen nicht von Implementierungsdetails abhängig sein, sondern die low-level Implementierung sollen gemäß der Abstraktionsschickt implemetiert werden. [^3]
- Die High-Level-Module beschreiben die Applikations- / Businesslogik, ohne direkt mit den Low-Level-Modulen zu interagieren, sondern lediglich auf Abstraktionen. [^3]
Kocoder marked this conversation as resolved Outdated

Korrektur: 'Businesslogik' (Tippfehler) und 'Abstraktionen' (Substantiv).

- Die High-Level-Module beschreiben die Applikations- / Businesslogik, ohne direkt mit den Low-Level-Modulen zu interagieren, sondern lediglich auf Abstraktionen. [^3]
Korrektur: 'Businesslogik' (Tippfehler) und 'Abstraktionen' (Substantiv). ```suggestion - Die High-Level-Module beschreiben die Applikations- / Businesslogik, ohne direkt mit den Low-Level-Modulen zu interagieren, sondern lediglich auf Abstraktionen. [^3] ```
Review

Grammatik/Stil: 'interagieren auf Abstraktionen' ist falsch. Korrekt: 'basieren auf Abstraktionen' oder 'interagieren mit Abstraktionen'.

- Die High-Level-Module beschreiben die Applikations-/Businesslogik, ohne direkt mit den Low-Level-Modulen zu interagieren; sie basieren lediglich auf Abstraktionen. [^3]
Grammatik/Stil: 'interagieren auf Abstraktionen' ist falsch. Korrekt: 'basieren auf Abstraktionen' oder 'interagieren mit Abstraktionen'. ```suggestion - Die High-Level-Module beschreiben die Applikations-/Businesslogik, ohne direkt mit den Low-Level-Modulen zu interagieren; sie basieren lediglich auf Abstraktionen. [^3] ```
- Die Abstraktionen sollen nicht von Implementierungsdetails abhängig sein, sondern die Low-Level-Implementierung sollen gemäß der Abstraktionsschicht implementiert werden. [^3]
Kocoder marked this conversation as resolved Outdated

Korrektur: 'Abstraktionsschicht' und 'implementiert' (Tippfehler).

- Die Abstraktionen sollen nicht von Implementierungsdetails abhängig sein, sondern die Low-Level-Implementierungen sollen gemäß der Abstraktionsschicht implementiert werden. [^3]
Korrektur: 'Abstraktionsschicht' und 'implementiert' (Tippfehler). ```suggestion - Die Abstraktionen sollen nicht von Implementierungsdetails abhängig sein, sondern die Low-Level-Implementierungen sollen gemäß der Abstraktionsschicht implementiert werden. [^3] ```
Review

Numerus: 'Implementierung' (Singular) passt nicht zu 'implementiert werden' (Plural).

- Die Abstraktionen sollen nicht von Implementierungsdetails abhängig sein, sondern die Low-Level-Implementierungen sollen gemäß der Abstraktionsschicht umgesetzt werden. [^3]
Numerus: 'Implementierung' (Singular) passt nicht zu 'implementiert werden' (Plural). ```suggestion - Die Abstraktionen sollen nicht von Implementierungsdetails abhängig sein, sondern die Low-Level-Implementierungen sollen gemäß der Abstraktionsschicht umgesetzt werden. [^3] ```
Ausgangslage ist eine Softwarearchitektur im Direct-Dependency-Graph Model.
Ausgangslage ist eine Softwarearchitektur im Direct-Dependency-Graph-Modell.
Kocoder marked this conversation as resolved Outdated

Deutsche Schreibweise: 'Modell' mit Doppel-L.

Ausgangslage ist eine Softwarearchitektur im Direct-Dependency-Graph-Modell.
Deutsche Schreibweise: 'Modell' mit Doppel-L. ```suggestion Ausgangslage ist eine Softwarearchitektur im Direct-Dependency-Graph-Modell. ```
```mermaid
architecture-beta
@@ -67,7 +67,7 @@ architecture-beta
b:R --> L:c
```
Bei diesem Beispiel ist die Klasse A ein high-level Modul, welches direkt auf die Klasse B referenziert, was das DI-Prinzip verbietet.
Review

Grammatik: 'auf die Klasse B referenziert' -> 'die Klasse B referenziert' oder 'auf die Klasse B verweist'.

Bei diesem Beispiel ist die Klasse A ein High-Level-Modul, welches direkt die Klasse B referenziert, was das DI-Prinzip verbietet.
Grammatik: 'auf die Klasse B referenziert' -> 'die Klasse B referenziert' oder 'auf die Klasse B verweist'. ```suggestion Bei diesem Beispiel ist die Klasse A ein High-Level-Modul, welches direkt die Klasse B referenziert, was das DI-Prinzip verbietet. ```
Das Problem dabei: Die einzelnen Klassen sind eng gekoppelt, was das austauschen von B mit einer anderen Klasse unmöglich macht. Genau dieses Problem wird vom DIP gelöst.
Das Problem dabei: Die einzelnen Klassen sind eng gekoppelt, was das Austauschen von B mit einer anderen Klasse unmöglich macht. Genau dieses Problem wird vom DIP gelöst.
Kocoder marked this conversation as resolved Outdated

Korrektur: 'Austauschen' (Substantivierung).

Das Problem dabei: Die einzelnen Klassen sind eng gekoppelt, was das Austauschen von B mit einer anderen Klasse unmöglich macht. Genau dieses Problem wird vom DIP gelöst.
Korrektur: 'Austauschen' (Substantivierung). ```suggestion Das Problem dabei: Die einzelnen Klassen sind eng gekoppelt, was das Austauschen von B mit einer anderen Klasse unmöglich macht. Genau dieses Problem wird vom DIP gelöst. ```
```mermaid
architecture-beta
@@ -82,14 +82,14 @@ architecture-beta
b:B --> T:ic
ic:R <-- L:c
```
Das high-level Modul ruft lediglich eine Abstraktion eines low-level Moduls auf, welche von einem, oder mehreren low-level Modulen implementiert worden ist. Für das high-level Modul ist es hier egal, welches low-level Modul die Implementierung bereitstellt. Dadurch erhält man einen viel modulareren Aufbau in der Software. Die einzelnen Module sind auch leichter austauschbar, testbar. Genau diese Modularität macht dependency injection möglich.
Das High-Level-Modul ruft lediglich eine Abstraktion eines Low-Level-Moduls auf, welche von einem, oder mehreren Low-Level-Modulen implementiert wurde. Für das High-Level-Modul ist es hier egal, welches Low-Level-Modul die Implementierung bereitstellt. Dadurch erhält man einen viel modulareren Aufbau in der Software. Die einzelnen Module sind auch leichter austauschbar und testbar. Genau diese Modularität macht Dependency Injection möglich.
Kocoder marked this conversation as resolved Outdated

Korrektur: 'Dependency Injection' (Eigennamen/Fachbegriffe groß) und 'implementiert wurde' (Stil).

Das High-Level-Modul ruft lediglich eine Abstraktion eines Low-Level-Moduls auf, welche von einem oder mehreren Low-Level-Modulen implementiert wurde. Für das High-Level-Modul ist es hier egal, welches Low-Level-Modul die Implementierung bereitstellt. Dadurch erhält man einen viel modulareren Aufbau in der Software. Die einzelnen Module sind auch leichter austauschbar und testbar. Genau diese Modularität macht Dependency Injection möglich.
Korrektur: 'Dependency Injection' (Eigennamen/Fachbegriffe groß) und 'implementiert wurde' (Stil). ```suggestion Das High-Level-Modul ruft lediglich eine Abstraktion eines Low-Level-Moduls auf, welche von einem oder mehreren Low-Level-Modulen implementiert wurde. Für das High-Level-Modul ist es hier egal, welches Low-Level-Modul die Implementierung bereitstellt. Dadurch erhält man einen viel modulareren Aufbau in der Software. Die einzelnen Module sind auch leichter austauschbar und testbar. Genau diese Modularität macht Dependency Injection möglich. ```
Review

Interpunktion: Kein Komma vor 'oder'. Stil: 'einen viel modulareren' -> 'einen wesentlich modulareren'.

Das High-Level-Modul ruft lediglich eine Abstraktion eines Low-Level-Moduls auf, welche von einem oder mehreren Low-Level-Modulen implementiert wurde. Für das High-Level-Modul ist es hier egal, welches Low-Level-Modul die Implementierung bereitstellt. Dadurch erhält man einen wesentlich modulareren Aufbau in der Software. Die einzelnen Module sind auch leichter austauschbar und testbar. Genau diese Modularität macht Dependency Injection möglich.
Interpunktion: Kein Komma vor 'oder'. Stil: 'einen viel modulareren' -> 'einen wesentlich modulareren'. ```suggestion Das High-Level-Modul ruft lediglich eine Abstraktion eines Low-Level-Moduls auf, welche von einem oder mehreren Low-Level-Modulen implementiert wurde. Für das High-Level-Modul ist es hier egal, welches Low-Level-Modul die Implementierung bereitstellt. Dadurch erhält man einen wesentlich modulareren Aufbau in der Software. Die einzelnen Module sind auch leichter austauschbar und testbar. Genau diese Modularität macht Dependency Injection möglich. ```
### Microsoft Dependency Injection Framework
Dependency Injektion ist in .Net genau so wie Konfiguration, Protokollierung und das Optionsmuster ins Framework integriert. [^4]
Dependency Injektion ist in .NET genau so wie Konfiguration, Protokollierung und das Optionsmuster ins Framework integriert. [^4]
Kocoder marked this conversation as resolved Outdated

Korrektur: '.NET' statt '.Net'.

Dependency Injection ist in .NET genau so wie Konfiguration, Protokollierung und das Optionsmuster ins Framework integriert. [^4]
Korrektur: '.NET' statt '.Net'. ```suggestion Dependency Injection ist in .NET genau so wie Konfiguration, Protokollierung und das Optionsmuster ins Framework integriert. [^4] ```
Review

Rechtschreibung: 'Injektion' vs. 'Injection' (Vereinheitlichung). 'genau so' -> 'genauso'.

Dependency Injection ist in .NET genauso wie Konfiguration, Protokollierung und das Optionsmuster ins Framework integriert. [^4]
Rechtschreibung: 'Injektion' vs. 'Injection' (Vereinheitlichung). 'genau so' -> 'genauso'. ```suggestion Dependency Injection ist in .NET genauso wie Konfiguration, Protokollierung und das Optionsmuster ins Framework integriert. [^4] ```
Alle Dependencies werden in einem `service container` zur verwaltung registriert. .Net hat einen eingebauten `service container` (eine Implementierung des `IServiceProvider`). [^4]
Alle Dependencies werden in einem `Service-Container` zur Verwaltung registriert. .NET hat einen eingebauten `Service-Container` (eine Implementierung des `IServiceProvider`). [^4]
Kocoder marked this conversation as resolved Outdated

Korrektur: 'Service-Container' (Bindestrich) und 'Verwaltung' (Großschreibung).

Alle Dependencies werden in einem Service-Container zur Verwaltung registriert. .NET hat einen eingebauten Service-Container (eine Implementierung des `IServiceProvider`). [^4]
Korrektur: 'Service-Container' (Bindestrich) und 'Verwaltung' (Großschreibung). ```suggestion Alle Dependencies werden in einem Service-Container zur Verwaltung registriert. .NET hat einen eingebauten Service-Container (eine Implementierung des `IServiceProvider`). [^4] ```
Das Dependency Injection Framework verwaltet alle Instanzen. Nach Bedarf werden instanzen erstellt, oder wieder entsorgt (sofern das Service nicht mehr gebraucht wird). Beim instanzieren einer Klasse werden alle im Konstruktor erwarteten Dependencies bereitgestellt, bzw. selbst instanziert und dannach bereitgestellt. [^4]
Das Dependency Injection Framework verwaltet alle Instanzen. Nach Bedarf werden Instanzen erstellt, oder wieder entsorgt (sofern das Service nicht mehr gebraucht wird). Beim Instanziieren einer Klasse werden alle im Konstruktor erwarteten Dependencies bereitgestellt, bzw. selbst instanziiert und dannach bereitgestellt. [^4]
Kocoder marked this conversation as resolved Outdated

Korrektur: 'Instanzen' (Substantiv), 'instanziiert' (Rechtschreibung) und 'danach' (Tippfehler).

Das Dependency Injection Framework verwaltet alle Instanzen. Nach Bedarf werden Instanzen erstellt oder wieder entsorgt (sofern der Service nicht mehr gebraucht wird). Beim Instanziieren einer Klasse werden alle im Konstruktor erwarteten Dependencies bereitgestellt bzw. selbst instanziiert und danach bereitgestellt. [^4]
Korrektur: 'Instanzen' (Substantiv), 'instanziiert' (Rechtschreibung) und 'danach' (Tippfehler). ```suggestion Das Dependency Injection Framework verwaltet alle Instanzen. Nach Bedarf werden Instanzen erstellt oder wieder entsorgt (sofern der Service nicht mehr gebraucht wird). Beim Instanziieren einer Klasse werden alle im Konstruktor erwarteten Dependencies bereitgestellt bzw. selbst instanziiert und danach bereitgestellt. [^4] ```
Review

Rechtschreibung: 'dannach' -> 'danach'. Genus: 'der Service' ist im IT-Kontext üblicher als 'das Service'.

Das Dependency Injection Framework verwaltet alle Instanzen. Nach Bedarf werden Instanzen erstellt oder wieder entsorgt (sofern der Service nicht mehr gebraucht wird). Beim Instanziieren einer Klasse werden alle im Konstruktor erwarteten Dependencies bereitgestellt bzw. selbst instanziiert und danach bereitgestellt. [^4]
Rechtschreibung: 'dannach' -> 'danach'. Genus: 'der Service' ist im IT-Kontext üblicher als 'das Service'. ```suggestion Das Dependency Injection Framework verwaltet alle Instanzen. Nach Bedarf werden Instanzen erstellt oder wieder entsorgt (sofern der Service nicht mehr gebraucht wird). Beim Instanziieren einer Klasse werden alle im Konstruktor erwarteten Dependencies bereitgestellt bzw. selbst instanziiert und danach bereitgestellt. [^4] ```
Hier ein Beispiel aus der Dokumentation von Microsoft: [^4]
```c#
@@ -127,13 +127,13 @@ public sealed class Worker(IMessageWriter messageWriter) : BackgroundService
}
}
```
Das ist ein simples Beispiel, welches Teile des DI Frameworks zeigt. Wir haben einen Service (Klasse Worker), ein Dependency (Klasse MessageWriter) und eine Abstraktionsebene, von dem Dependency (Interface IMessage Writer).
Das ist ein simples Beispiel, welches Teile des DI Frameworks zeigt. Wir haben einen Service (Klasse Worker), ein Dependency (Klasse MessageWriter) und eine Abstraktionsebene, von dem Dependency (Interface IMessageWriter).
Kocoder marked this conversation as resolved Outdated

Korrektur: 'Dependency' (Großschreibung am Satzanfang/Substantiv) und 'IMessageWriter' (Zusammenschreibung).

Das ist ein simples Beispiel, welches Teile des DI-Frameworks zeigt. Wir haben einen Service (Klasse Worker), eine Dependency (Klasse MessageWriter) und eine Abstraktionsebene von der Dependency (Interface IMessageWriter).
Korrektur: 'Dependency' (Großschreibung am Satzanfang/Substantiv) und 'IMessageWriter' (Zusammenschreibung). ```suggestion Das ist ein simples Beispiel, welches Teile des DI-Frameworks zeigt. Wir haben einen Service (Klasse Worker), eine Dependency (Klasse MessageWriter) und eine Abstraktionsebene von der Dependency (Interface IMessageWriter). ```
Review

Genus: 'Dependency' wird im Deutschen meist feminin gebraucht ('eine').

Das ist ein simples Beispiel, welches Teile des DI-Frameworks zeigt. Wir haben einen Service (Klasse Worker), eine Dependency (Klasse MessageWriter) und eine Abstraktionsebene dieser Dependency (Interface IMessageWriter).
Genus: 'Dependency' wird im Deutschen meist feminin gebraucht ('eine'). ```suggestion Das ist ein simples Beispiel, welches Teile des DI-Frameworks zeigt. Wir haben einen Service (Klasse Worker), eine Dependency (Klasse MessageWriter) und eine Abstraktionsebene dieser Dependency (Interface IMessageWriter). ```
Bei Programstart wird zuerst manuell der `Service Container` erstellt, dannach alle Module registriert (entweder als HostedService, oder als Modul mit einer spezifischen Lifetime (Scoped, Transient, Singleton)).
Bei Programmstart wird zuerst manuell der `Service-Container` erstellt, dannach alle Module registriert (entweder als HostedService, oder als Modul mit einer spezifischen Lifetime (Scoped, Transient, Singleton)).
Kocoder marked this conversation as resolved Outdated

Korrektur: 'Programmstart' (Doppel-m) und 'danach' (Tippfehler).

Bei Programmstart wird zuerst manuell der Service-Container erstellt, danach alle Module registriert (entweder als HostedService oder als Modul mit einer spezifischen Lifetime (Scoped, Transient, Singleton)).
Korrektur: 'Programmstart' (Doppel-m) und 'danach' (Tippfehler). ```suggestion Bei Programmstart wird zuerst manuell der Service-Container erstellt, danach alle Module registriert (entweder als HostedService oder als Modul mit einer spezifischen Lifetime (Scoped, Transient, Singleton)). ```
Review

Rechtschreibung: 'dannach' -> 'danach'.

Bei Programmstart wird zuerst manuell der `Service-Container` erstellt, danach werden alle Module registriert (entweder als HostedService oder als Modul mit einer spezifischen Lifetime (Scoped, Transient, Singleton)).
Rechtschreibung: 'dannach' -> 'danach'. ```suggestion Bei Programmstart wird zuerst manuell der `Service-Container` erstellt, danach werden alle Module registriert (entweder als HostedService oder als Modul mit einer spezifischen Lifetime (Scoped, Transient, Singleton)). ```
Mit dem Aufruf von `builder.Build()` wird intern ein Dependency Graph erstellt und mit `host.Run()` wird versucht die Klasse Worker zu instanzieren und zu starten. Nachdem Worker ein Dependency auf IMessageWriter hat wird über den zuvor erstelltem Dependency Graph die implementierung von IMessageWriter gesucht. Jetzt wird MessageWriter instanziert und dem Konstruktor von Worker übergeben, damit seine Dependencies befriedigt werden.
Mit dem Aufruf von `builder.Build()` wird intern ein Dependency Graph erstellt und mit `host.Run()` wird versucht die Klasse Worker zu instanziieren und zu starten. Nachdem Worker ein Dependency auf IMessageWriter hat, wird über den zuvor erstellten Dependency-Graph die Implementierung von IMessageWriter gesucht. Jetzt wird MessageWriter instanziiert und dem Konstruktor von Worker übergeben, damit seine Dependencies befriedigt werden.
Kocoder marked this conversation as resolved Outdated

Korrektur: 'den zuvor erstellten' (Grammatik), 'Implementierung' (Großschreibung) und 'danach'.

Mit dem Aufruf von `builder.Build()` wird intern ein Dependency-Graph erstellt und mit `host.Run()` wird versucht, die Klasse Worker zu instanziieren und zu starten. Nachdem Worker eine Dependency auf IMessageWriter hat, wird über den zuvor erstellten Dependency-Graph die Implementierung von IMessageWriter gesucht. Jetzt wird MessageWriter instanziiert und dem Konstruktor von Worker übergeben, damit seine Dependencies befriedigt werden.
Korrektur: 'den zuvor erstellten' (Grammatik), 'Implementierung' (Großschreibung) und 'danach'. ```suggestion Mit dem Aufruf von `builder.Build()` wird intern ein Dependency-Graph erstellt und mit `host.Run()` wird versucht, die Klasse Worker zu instanziieren und zu starten. Nachdem Worker eine Dependency auf IMessageWriter hat, wird über den zuvor erstellten Dependency-Graph die Implementierung von IMessageWriter gesucht. Jetzt wird MessageWriter instanziiert und dem Konstruktor von Worker übergeben, damit seine Dependencies befriedigt werden. ```
Review

Grammatik/Genus: 'ein Dependency' -> 'eine Dependency'.

Mit dem Aufruf von `builder.Build()` wird intern ein Dependency-Graph erstellt und mit `host.Run()` wird versucht, die Klasse Worker zu instanziieren und zu starten. Nachdem Worker eine Dependency auf IMessageWriter hat, wird über den zuvor erstellten Dependency-Graph die Implementierung von IMessageWriter gesucht. Jetzt wird MessageWriter instanziiert und dem Konstruktor von Worker übergeben, damit seine Dependencies befriedigt werden.
Grammatik/Genus: 'ein Dependency' -> 'eine Dependency'. ```suggestion Mit dem Aufruf von `builder.Build()` wird intern ein Dependency-Graph erstellt und mit `host.Run()` wird versucht, die Klasse Worker zu instanziieren und zu starten. Nachdem Worker eine Dependency auf IMessageWriter hat, wird über den zuvor erstellten Dependency-Graph die Implementierung von IMessageWriter gesucht. Jetzt wird MessageWriter instanziiert und dem Konstruktor von Worker übergeben, damit seine Dependencies befriedigt werden. ```
So sehen der Abhängigkeitsgraph bei diesem Beispiel aus.
So sieht der Abhängigkeitsgraph bei diesem Beispiel aus.
Kocoder marked this conversation as resolved Outdated

Grammatik: 'So sieht der Abhängigkeitsgraph... aus' (Singular).

So sieht der Abhängigkeitsgraph bei diesem Beispiel aus.
Grammatik: 'So sieht der Abhängigkeitsgraph... aus' (Singular). ```suggestion So sieht der Abhängigkeitsgraph bei diesem Beispiel aus. ```
```mermaid
architecture-beta
@@ -164,7 +164,7 @@ architecture-beta
## Arbeitszeiteinschätzung (Zeitverzug)
## Teamleitung (Motivation / Downsizing)
## Produktion != Staging
## Sprints und Meetings (in Zukunft ja Asyncron
## Sprints und Meetings (in Zukunft ja asynchron)
Kocoder marked this conversation as resolved Outdated

Korrektur: 'asynchron' (Rechtschreibung und Kleinschreibung).

## Sprints und Meetings (in Zukunft eher asynchron)
Korrektur: 'asynchron' (Rechtschreibung und Kleinschreibung). ```suggestion ## Sprints und Meetings (in Zukunft eher asynchron) ```
# Modules
## Mass Mailer