oqtane-general-description #62
@@ -49,13 +49,13 @@ architecture-beta
|
||||
## 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
gitea-actions
commented
Zahlen von eins bis zwölf werden im Fließtext üblicherweise ausgeschrieben. 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.
```
gitea-actions
commented
Grammatik: 'von den fünf' -> 'der fünf' (Genitiv ist stilistisch besser). 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.
|
||||
|
gitea-actions
commented
Großschreibung: Im Deutschen werden Adjektive in Titeln/Eigennamen wie 'High-Level' großgeschrieben. 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
gitea-actions
commented
Korrektur: 'Businesslogik' (Tippfehler) und 'Abstraktionen' (Substantiv). 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]
```
gitea-actions
commented
Grammatik/Stil: 'interagieren auf Abstraktionen' ist falsch. Korrekt: 'basieren auf Abstraktionen' oder 'interagieren mit Abstraktionen'. 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
gitea-actions
commented
Korrektur: 'Abstraktionsschicht' und 'implementiert' (Tippfehler). 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]
```
gitea-actions
commented
Numerus: 'Implementierung' (Singular) passt nicht zu 'implementiert werden' (Plural). 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
gitea-actions
commented
Deutsche Schreibweise: 'Modell' mit Doppel-L. 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.
|
||||
|
gitea-actions
commented
Grammatik: 'auf die Klasse B referenziert' -> 'die Klasse B referenziert' oder 'auf die Klasse B verweist'. 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
gitea-actions
commented
Korrektur: 'Austauschen' (Substantivierung). 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
gitea-actions
commented
Korrektur: 'Dependency Injection' (Eigennamen/Fachbegriffe groß) und 'implementiert wurde' (Stil). 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.
```
gitea-actions
commented
Interpunktion: Kein Komma vor 'oder'. Stil: 'einen viel modulareren' -> 'einen wesentlich modulareren'. 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
gitea-actions
commented
Korrektur: '.NET' statt '.Net'. Korrektur: '.NET' statt '.Net'.
```suggestion
Dependency Injection ist in .NET genau so wie Konfiguration, Protokollierung und das Optionsmuster ins Framework integriert. [^4]
```
gitea-actions
commented
Rechtschreibung: 'Injektion' vs. 'Injection' (Vereinheitlichung). 'genau so' -> 'genauso'. 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
gitea-actions
commented
Korrektur: 'Service-Container' (Bindestrich) und 'Verwaltung' (Großschreibung). 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
gitea-actions
commented
Korrektur: 'Instanzen' (Substantiv), 'instanziiert' (Rechtschreibung) und 'danach' (Tippfehler). 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]
```
gitea-actions
commented
Rechtschreibung: 'dannach' -> 'danach'. Genus: 'der Service' ist im IT-Kontext üblicher als 'das Service'. 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
gitea-actions
commented
Korrektur: 'Dependency' (Großschreibung am Satzanfang/Substantiv) und 'IMessageWriter' (Zusammenschreibung). 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).
```
gitea-actions
commented
Genus: 'Dependency' wird im Deutschen meist feminin gebraucht ('eine'). 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
gitea-actions
commented
Korrektur: 'Programmstart' (Doppel-m) und 'danach' (Tippfehler). 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)).
```
gitea-actions
commented
Rechtschreibung: 'dannach' -> 'danach'. 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
gitea-actions
commented
Korrektur: 'den zuvor erstellten' (Grammatik), 'Implementierung' (Großschreibung) und 'danach'. 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.
```
gitea-actions
commented
Grammatik/Genus: 'ein Dependency' -> 'eine Dependency'. 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
gitea-actions
commented
Grammatik: 'So sieht der Abhängigkeitsgraph... aus' (Singular). 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
gitea-actions
commented
Korrektur: 'asynchron' (Rechtschreibung und Kleinschreibung). Korrektur: 'asynchron' (Rechtschreibung und Kleinschreibung).
```suggestion
## Sprints und Meetings (in Zukunft eher asynchron)
```
|
||||
|
||||
# Modules
|
||||
## Mass Mailer
|
||||
|
||||
Großschreibung: 'injection' -> 'Injection'.