kh-blazor-razor #66

Merged
Kocoder merged 22 commits from kh-blazor-razor into main 2026-03-19 07:22:47 +00:00
Owner
No description provided.
Kocoder added 2 commits 2026-03-08 13:15:58 +00:00
Update Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md
All checks were successful
Gemini Writing Review / gemini-review (pull_request) Successful in 4m24s
Word Count / count-words (pull_request) Successful in 32s
93a788d292
KH: Blazor beschreibung
All checks were successful
Gemini Writing Review / gemini-review (pull_request) Successful in 9m40s
Word Count / count-words (pull_request) Successful in 33s
56d623c8e0
gitea-actionsbot requested changes 2026-03-08 13:30:22 +00:00
gitea-actionsbot left a comment

🤖 Gemini Writing Review

I've found some areas for improvement in the documentation. Please see the inline comments below.

### 🤖 Gemini Writing Review I've found some areas for improvement in the documentation. Please see the inline comments below.

Grammatik und Rechtschreibung: 'entwickel' -> 'entwickle'. 'React.JS' -> 'React.js'. Der erste Satz ist ein Fragment; besser: 'Das Ziel ist das Erlernen von...'.

Das Erlernen von ASP.NET und der Entwicklung mit Blazor und Oqtane. Ich habe Interesse an dem Thema Webentwicklung. Privat entwickle ich schon seit Jahren viel mit React.js.
Grammatik und Rechtschreibung: 'entwickel' -> 'entwickle'. 'React.JS' -> 'React.js'. Der erste Satz ist ein Fragment; besser: 'Das Ziel ist das Erlernen von...'. ```suggestion Das Erlernen von ASP.NET und der Entwicklung mit Blazor und Oqtane. Ich habe Interesse an dem Thema Webentwicklung. Privat entwickle ich schon seit Jahren viel mit React.js. ```

Grammatik und Stil: 'im Lauf' -> 'im Laufe'. '.NET Core 10' wird offiziell nur noch '.NET 10' genannt.

Nachdem wir im Unterricht fast ausschließlich mit C# entwickelt haben und nicht in eine komplett unbekannte Entwicklungsumgebung abdriften wollten, haben wir uns für Webentwicklung mit ASP.NET Core 9 und (Upgrade im Laufe der Diplomarbeit auf .NET 10) dem CMS Oqtane entschieden. Auch hier gab es einige Kandidaten:
Grammatik und Stil: 'im Lauf' -> 'im Laufe'. '.NET Core 10' wird offiziell nur noch '.NET 10' genannt. ```suggestion Nachdem wir im Unterricht fast ausschließlich mit C# entwickelt haben und nicht in eine komplett unbekannte Entwicklungsumgebung abdriften wollten, haben wir uns für Webentwicklung mit ASP.NET Core 9 und (Upgrade im Laufe der Diplomarbeit auf .NET 10) dem CMS Oqtane entschieden. Auch hier gab es einige Kandidaten: ```

Rechtschreibung: 'großen und ganzen' wird großgeschrieben.

Viel Arbeit mit Partials, welche in der Admin Oberfläche geschieht, aber sehr gut dokumentiert. Im Großen und Ganzen wirkt Umbraco nicht so flexibel.
Rechtschreibung: 'großen und ganzen' wird großgeschrieben. ```suggestion Viel Arbeit mit Partials, welche in der Admin Oberfläche geschieht, aber sehr gut dokumentiert. Im Großen und Ganzen wirkt Umbraco nicht so flexibel. ```

Grammatik und Stil: 'Und ein Windows Server würde ich ich...' ist umgangssprachlich und enthält ein doppeltes Wort. 'kostet' ist redundant zu 'Lizenzkosten'.

Platzhirsch. Bekannt, wird von der DNN Foundation gewartet. Arbeitet mit dem .NET Framework, welches nicht unter Linux läuft. Einen Windows-Server würde ich nicht einfach so im Internet betreiben, abgesehen von den anfallenden Lizenzkosten.
Grammatik und Stil: 'Und ein Windows Server würde ich ich...' ist umgangssprachlich und enthält ein doppeltes Wort. 'kostet' ist redundant zu 'Lizenzkosten'. ```suggestion Platzhirsch. Bekannt, wird von der DNN Foundation gewartet. Arbeitet mit dem .NET Framework, welches nicht unter Linux läuft. Einen Windows-Server würde ich nicht einfach so im Internet betreiben, abgesehen von den anfallenden Lizenzkosten. ```

Rechtschreibung: 'implementiereung' -> 'Implementierung'.

2. Mit welcher speziellen Implementierung bekommen wir Support und haben Wissen im Team?
Rechtschreibung: 'implementiereung' -> 'Implementierung'. ```suggestion 2. Mit welcher speziellen Implementierung bekommen wir Support und haben Wissen im Team? ```

Rechtschreibung/Grammatik: 'erfahrungen' -> 'Erfahrungen', 'SQL basiertes' -> 'SQL-basiertes'.

Es war von Anfang an klar, dass es ein SQL-basiertes System wird, da wir im Team nur mit SQL-basierten Systemen Erfahrungen haben. Außerdem unterstützt unser CMS (Oqtane) nur SQL-basierte Systeme. In der Linuxwelt kommen jetzt nur noch ein paar Datenbanken in die Auswahl: PostgreSQL, MySQL / MariaDB, SQLite. Da ist die Wahl auf PostgreSQL gefallen. Grund dafür war meine Vorerfahrung mit diesem DBMS, welche ich im Nebenjob errungen habe.
Rechtschreibung/Grammatik: 'erfahrungen' -> 'Erfahrungen', 'SQL basiertes' -> 'SQL-basiertes'. ```suggestion Es war von Anfang an klar, dass es ein SQL-basiertes System wird, da wir im Team nur mit SQL-basierten Systemen Erfahrungen haben. Außerdem unterstützt unser CMS (Oqtane) nur SQL-basierte Systeme. In der Linuxwelt kommen jetzt nur noch ein paar Datenbanken in die Auswahl: PostgreSQL, MySQL / MariaDB, SQLite. Da ist die Wahl auf PostgreSQL gefallen. Grund dafür war meine Vorerfahrung mit diesem DBMS, welche ich im Nebenjob errungen habe. ```
@@ -51,4 +51,3 @@
# Technologie
## Entwicklung mit ASP.NET (Was ist Blazor? / Was ist Razor? / Kestrel)
## Was ist Oqtane? Architektur von Oqtane?
Oqtane ist ein Framework und CMS zur Entwicklung von Webseiten mithilfe von ASP.NET und Blazor. [^5] Ein Oqtane-System besteht aus mehreren Komponenten.

Stil: 'Webseiten' bezieht sich meist auf einzelne Seiten, 'Websites' oder 'Webauftritte' auf das gesamte System.

Oqtane ist ein Framework und CMS zur Entwicklung von Websites mithilfe von ASP.NET und Blazor. [^5] Ein Oqtane-System besteht aus mehreren Komponenten.
Stil: 'Webseiten' bezieht sich meist auf einzelne Seiten, 'Websites' oder 'Webauftritte' auf das gesamte System. ```suggestion Oqtane ist ein Framework und CMS zur Entwicklung von Websites mithilfe von ASP.NET und Blazor. [^5] Ein Oqtane-System besteht aus mehreren Komponenten. ```

Rechtschreibung: 'Inferfaces' -> 'Interfaces', 'Client-Staruplogik' -> 'Client-Startuplogik'.

Im Client-Projekt liegen Code und Razor-Komponenten für den Client. Also Client-Startuplogik, Client-Services (+ Interfaces dafür, die Services hier sollen lediglich die Server-Services über HTTP aufrufen), Ressourcendateien (.resx), die Komponenten / das User Interface und die Moduldefinitionen für jedes Modul.
Rechtschreibung: 'Inferfaces' -> 'Interfaces', 'Client-Staruplogik' -> 'Client-Startuplogik'. ```suggestion Im Client-Projekt liegen Code und Razor-Komponenten für den Client. Also Client-Startuplogik, Client-Services (+ Interfaces dafür, die Services hier sollen lediglich die Server-Services über HTTP aufrufen), Ressourcendateien (.resx), die Komponenten / das User Interface und die Moduldefinitionen für jedes Modul. ```

Rechtschreibung: 'Package Projekt' -> 'Package-Projekt'.

Im Package-Projekt findet man Skripte zum Debuggen und Releasen eines Moduls. Und die NuGet-Spezifikation.
Rechtschreibung: 'Package Projekt' -> 'Package-Projekt'. ```suggestion Im Package-Projekt findet man Skripte zum Debuggen und Releasen eines Moduls. Und die NuGet-Spezifikation. ```
@@ -76,1 +75,3 @@
## Systemarchitektur (Postgres / Oqtane / Nginx )
## Systemarchitektur (Postgres / Oqtane / Nginx)
In diesem Kapitel erkläre ich wie die ausgewählten Komponenten zusammenspielen. Wir verwenden NginX als Reverse Proxy, welcher bei uns die SSL Terminierung macht. Das Zertifikat, welches verwendet wird, wird von Let's Encrypt bereit gestellt und mitels HTTP-Challanges und dem Certbot auf dem Server aktualisiert und verwaltet. Oqtane selber läuft als Systemd-Service im Kestrel Backend. Kestrel ist ein kleiner Webserver, welcher in das ASP.NET Core Framework eingebaut worden ist. Oqtane (bzw. der ASP.NET Core Server "Kestrel") hört auf der Loopback IP und Port 5000. Damit ist Oqtane nur durch NginX erreichbar. PostgreSQL ist die Datenbank in dem System: Sie hört wieder auf der Loopback IP und Port 5432.

Rechtschreibung: 'mitels' -> 'mittels', 'Challanges' -> 'Challenges'. 'NginX' -> 'Nginx'.

In diesem Kapitel erkläre ich wie die ausgewählten Komponenten zusammenspielen. Wir verwenden Nginx als Reverse Proxy, welcher bei uns die SSL Terminierung macht. Das Zertifikat, welches verwendet wird, wird von Let's Encrypt bereit gestellt und mittels HTTP-Challenges und dem Certbot auf dem Server aktualisiert und verwaltet. Oqtane selber läuft als Systemd-Service im Kestrel Backend. Kestrel ist ein kleiner Webserver, welcher in das ASP.NET Core Framework eingebaut worden ist. Oqtane (bzw. der ASP.NET Core Server "Kestrel") hört auf der Loopback IP und Port 5000. Damit ist Oqtane nur durch Nginx erreichbar. PostgreSQL ist die Datenbank in dem System: Sie hört wieder auf der Loopback IP und Port 5432.
Rechtschreibung: 'mitels' -> 'mittels', 'Challanges' -> 'Challenges'. 'NginX' -> 'Nginx'. ```suggestion In diesem Kapitel erkläre ich wie die ausgewählten Komponenten zusammenspielen. Wir verwenden Nginx als Reverse Proxy, welcher bei uns die SSL Terminierung macht. Das Zertifikat, welches verwendet wird, wird von Let's Encrypt bereit gestellt und mittels HTTP-Challenges und dem Certbot auf dem Server aktualisiert und verwaltet. Oqtane selber läuft als Systemd-Service im Kestrel Backend. Kestrel ist ein kleiner Webserver, welcher in das ASP.NET Core Framework eingebaut worden ist. Oqtane (bzw. der ASP.NET Core Server "Kestrel") hört auf der Loopback IP und Port 5000. Damit ist Oqtane nur durch Nginx erreichbar. PostgreSQL ist die Datenbank in dem System: Sie hört wieder auf der Loopback IP und Port 5432. ```
@@ -93,0 +95,4 @@
## Entwicklung mit ASP.NET (Was ist Blazor? / Was ist Razor? / Kestrel)
### Blazor [^7]
Blazor ist ein kostenloses und quelloffenes Web-Framework, welches es Möglich macht, Benutzeroberflächen für Web-Browser basierend auf C# and HTML zu erstellen. Es wird von Microsoft als teil des ASP.NET Core Frameworks entwickelt.

Rechtschreibung: 'Möglich' -> 'möglich', 'and' -> 'und' (Sprachmix), 'teil' -> 'Teil'.

Blazor ist ein kostenloses und quelloffenes Web-Framework, welches es möglich macht, Benutzeroberflächen für Web-Browser basierend auf C# und HTML zu erstellen. Es wird von Microsoft als Teil des ASP.NET Core Frameworks entwickelt.
Rechtschreibung: 'Möglich' -> 'möglich', 'and' -> 'und' (Sprachmix), 'teil' -> 'Teil'. ```suggestion Blazor ist ein kostenloses und quelloffenes Web-Framework, welches es möglich macht, Benutzeroberflächen für Web-Browser basierend auf C# und HTML zu erstellen. Es wird von Microsoft als Teil des ASP.NET Core Frameworks entwickelt. ```
@@ -93,0 +99,4 @@
Blazor hat mehrere Hosting-Modelle:
- Blazor Web App: Hier wird die Web App als Teil einer ASP.NET Core Anwendung bereitgestellt. Hier gibt es mehrere Render Modi:
- Static Server: Die Komponente wird serverseitig "gerenderet" und besitzt keine Interaktivität. Das istder Default `RenderMode`

Rechtschreibung: 'gerenderet' -> 'gerendert', 'dasder' -> 'das ist der'.

  - Static Server: Die Komponente wird serverseitig "gerendert" und besitzt keine Interaktivität. Das ist der Default `RenderMode`
Rechtschreibung: 'gerenderet' -> 'gerendert', 'dasder' -> 'das ist der'. ```suggestion - Static Server: Die Komponente wird serverseitig "gerendert" und besitzt keine Interaktivität. Das ist der Default `RenderMode` ```
@@ -93,0 +100,4 @@
Blazor hat mehrere Hosting-Modelle:
- Blazor Web App: Hier wird die Web App als Teil einer ASP.NET Core Anwendung bereitgestellt. Hier gibt es mehrere Render Modi:
- Static Server: Die Komponente wird serverseitig "gerenderet" und besitzt keine Interaktivität. Das istder Default `RenderMode`
- Interative Server: Die Komponente wird serverseitig "gerendert", diesmal ist sie jedoch interaktiv. Das bedeutet: Man kann mithilfe von C# den Zustand der Seite dynamisch bearbeiten. Diese Zustandsänderungen werden serverseitig bearbeitet. Hierbei kommunizieren Server und Client mithilfe von SignalR über WebSockets miteinander.

Rechtschreibung: 'Interative' -> 'Interactive'.

  - Interactive Server: Die Komponente wird serverseitig "gerendert", diesmal ist sie jedoch interaktiv. Das bedeutet: Man kann mithilfe von C# den Zustand der Seite dynamisch bearbeiten. Diese Zustandsänderungen werden serverseitig bearbeitet. Hierbei kommunizieren Server und Client mithilfe von SignalR über WebSockets miteinander.
Rechtschreibung: 'Interative' -> 'Interactive'. ```suggestion - Interactive Server: Die Komponente wird serverseitig "gerendert", diesmal ist sie jedoch interaktiv. Das bedeutet: Man kann mithilfe von C# den Zustand der Seite dynamisch bearbeiten. Diese Zustandsänderungen werden serverseitig bearbeitet. Hierbei kommunizieren Server und Client mithilfe von SignalR über WebSockets miteinander. ```
@@ -93,0 +102,4 @@
- Static Server: Die Komponente wird serverseitig "gerenderet" und besitzt keine Interaktivität. Das istder Default `RenderMode`
- Interative Server: Die Komponente wird serverseitig "gerendert", diesmal ist sie jedoch interaktiv. Das bedeutet: Man kann mithilfe von C# den Zustand der Seite dynamisch bearbeiten. Diese Zustandsänderungen werden serverseitig bearbeitet. Hierbei kommunizieren Server und Client mithilfe von SignalR über WebSockets miteinander.
- Interactive WebAssembly: Die Komponente wird clientseitig, also im Browser, "gerendert". Damit der Blazor C# Code auch im Browser ausgeführt werden kann wird dieser in WebAssembly kompiliert.
- Interactive Auto: Im `Interactive Auto` Modul wird bei dem initialen Besuch der Website der `Interactive Server` Modus gewählt und im Hintergrund wird der WebAssembly-Build heruntergeladen, damit bei weiteren Besuchen der Seite der `Interactive WebAssembly` Modus gewählt werden kann.

Kontext: 'Modul' -> 'Modus' (bezieht sich auf Render-Modi).

  - Interactive Auto: Im `Interactive Auto` Modus wird bei dem initialen Besuch der Website der `Interactive Server` Modus gewählt und im Hintergrund wird der WebAssembly-Build heruntergeladen, damit bei weiteren Besuchen der Seite der `Interactive WebAssembly` Modus gewählt werden kann.
Kontext: 'Modul' -> 'Modus' (bezieht sich auf Render-Modi). ```suggestion - Interactive Auto: Im `Interactive Auto` Modus wird bei dem initialen Besuch der Website der `Interactive Server` Modus gewählt und im Hintergrund wird der WebAssembly-Build heruntergeladen, damit bei weiteren Besuchen der Seite der `Interactive WebAssembly` Modus gewählt werden kann. ```
@@ -93,0 +103,4 @@
- Interative Server: Die Komponente wird serverseitig "gerendert", diesmal ist sie jedoch interaktiv. Das bedeutet: Man kann mithilfe von C# den Zustand der Seite dynamisch bearbeiten. Diese Zustandsänderungen werden serverseitig bearbeitet. Hierbei kommunizieren Server und Client mithilfe von SignalR über WebSockets miteinander.
- Interactive WebAssembly: Die Komponente wird clientseitig, also im Browser, "gerendert". Damit der Blazor C# Code auch im Browser ausgeführt werden kann wird dieser in WebAssembly kompiliert.
- Interactive Auto: Im `Interactive Auto` Modul wird bei dem initialen Besuch der Website der `Interactive Server` Modus gewählt und im Hintergrund wird der WebAssembly-Build heruntergeladen, damit bei weiteren Besuchen der Seite der `Interactive WebAssembly` Modus gewählt werden kann.
- Hybrid: Dieser Modus ist der einzige, welcher nicht innerhalb einer Blazor Web App läuft, sondern in einem WebView einer Nativen App. Dabei wird innerhalb des Mutterprozesses, ganz ohne WebServer. Das ganze Funktioniert in WPF und WinForms Apps und in nativen mobilen Apps für Android und iOS mithilfe von .NET MAUI.

Rechtschreibung: 'Nativen' -> 'nativen', 'Funktioniert' -> 'funktioniert'.

- Hybrid: Dieser Modus ist der einzige, welcher nicht innerhalb einer Blazor Web App läuft, sondern in einem WebView einer nativen App. Dabei wird innerhalb des Mutterprozesses, ganz ohne Webserver, gearbeitet. Das Ganze funktioniert in WPF und WinForms Apps und in nativen mobilen Apps für Android und iOS mithilfe von .NET MAUI.
Rechtschreibung: 'Nativen' -> 'nativen', 'Funktioniert' -> 'funktioniert'. ```suggestion - Hybrid: Dieser Modus ist der einzige, welcher nicht innerhalb einer Blazor Web App läuft, sondern in einem WebView einer nativen App. Dabei wird innerhalb des Mutterprozesses, ganz ohne Webserver, gearbeitet. Das Ganze funktioniert in WPF und WinForms Apps und in nativen mobilen Apps für Android und iOS mithilfe von .NET MAUI. ```
@@ -93,0 +105,4 @@
- Interactive Auto: Im `Interactive Auto` Modul wird bei dem initialen Besuch der Website der `Interactive Server` Modus gewählt und im Hintergrund wird der WebAssembly-Build heruntergeladen, damit bei weiteren Besuchen der Seite der `Interactive WebAssembly` Modus gewählt werden kann.
- Hybrid: Dieser Modus ist der einzige, welcher nicht innerhalb einer Blazor Web App läuft, sondern in einem WebView einer Nativen App. Dabei wird innerhalb des Mutterprozesses, ganz ohne WebServer. Das ganze Funktioniert in WPF und WinForms Apps und in nativen mobilen Apps für Android und iOS mithilfe von .NET MAUI.
Razor-Komponenten (in dieser Arbeit, sowie Umgangssprachlich, auch oft nur Komponenten genannt) sind der Grundbaustein für Blazor Web Apps. Sie bestehen aus HTML, welches mit der Verwendung von inline C# beeinflusst werden kann. Das Blazor stellt sicher, dass das gerenderte Markup aktualisiert wird, wenn sicher der Status der Komponente ändert. Dieser Code kann entweder vollständig in einer .razor Dateil liegen, oder in einer seperaten Code-Behind-Datei und der benutzer einer partiellen Klasse. Inline C# Code wird mithilfe von dem `@`- Zeichen markiert. Hier ist ein Beispiel für einen einfachen Counter:

Rechtschreibung/Grammatik: 'Dateil' -> 'Datei', 'seperaten' -> 'separaten', 'benutzer' -> 'Benutzung'.

Razor-Komponenten (in dieser Arbeit, sowie umgangssprachlich, auch oft nur Komponenten genannt) sind der Grundbaustein für Blazor Web Apps. Sie bestehen aus HTML, welches mit der Verwendung von Inline C# beeinflusst werden kann. Blazor stellt sicher, dass das gerenderte Markup aktualisiert wird, wenn sich der Status der Komponente ändert. Dieser Code kann entweder vollständig in einer .razor Datei liegen, oder in einer separaten Code-Behind-Datei und der Benutzung einer partiellen Klasse. Inline C# Code wird mithilfe von dem `@`-Zeichen markiert. Hier ist ein Beispiel für einen einfachen Counter:
Rechtschreibung/Grammatik: 'Dateil' -> 'Datei', 'seperaten' -> 'separaten', 'benutzer' -> 'Benutzung'. ```suggestion Razor-Komponenten (in dieser Arbeit, sowie umgangssprachlich, auch oft nur Komponenten genannt) sind der Grundbaustein für Blazor Web Apps. Sie bestehen aus HTML, welches mit der Verwendung von Inline C# beeinflusst werden kann. Blazor stellt sicher, dass das gerenderte Markup aktualisiert wird, wenn sich der Status der Komponente ändert. Dieser Code kann entweder vollständig in einer .razor Datei liegen, oder in einer separaten Code-Behind-Datei und der Benutzung einer partiellen Klasse. Inline C# Code wird mithilfe von dem `@`-Zeichen markiert. Hier ist ein Beispiel für einen einfachen Counter: ```
@@ -93,0 +125,4 @@
}
```
Mit`@count` in Zeile 3 wird der Wert der Variablen count in den `<p>` Tag mit eingebaut. Mit `@onclick="Increment"` in Zeile 5 wird die onclick Property vom `<button>`Tag auf die Increment Methode im C# Code. Der `@code` Block in Zeile 7 ist der C# Code, welcher diese Komponente dynamisch macht. Hier ist die Variable count definiert und die Methode Increment, welche dieser Komponente interaktiv macht.

Grammatik: 'welcher dieser Komponente' -> 'welcher diese Komponente'. Fehlende Leerzeichen bei Code-Referenzen.

Mit `@count` in Zeile 3 wird der Wert der Variablen count in den `<p>` Tag eingebaut. Mit `@onclick="Increment"` in Zeile 5 wird die onclick Property vom `<button>` Tag auf die Increment Methode im C# Code gemappt. Der `@code` Block in Zeile 7 ist der C# Code, welcher diese Komponente dynamisch macht. Hier ist die Variable count definiert und die Methode Increment, welche diese Komponente interaktiv macht.
Grammatik: 'welcher dieser Komponente' -> 'welcher diese Komponente'. Fehlende Leerzeichen bei Code-Referenzen. ```suggestion Mit `@count` in Zeile 3 wird der Wert der Variablen count in den `<p>` Tag eingebaut. Mit `@onclick="Increment"` in Zeile 5 wird die onclick Property vom `<button>` Tag auf die Increment Methode im C# Code gemappt. Der `@code` Block in Zeile 7 ist der C# Code, welcher diese Komponente dynamisch macht. Hier ist die Variable count definiert und die Methode Increment, welche diese Komponente interaktiv macht. ```
@@ -93,0 +127,4 @@
Mit`@count` in Zeile 3 wird der Wert der Variablen count in den `<p>` Tag mit eingebaut. Mit `@onclick="Increment"` in Zeile 5 wird die onclick Property vom `<button>`Tag auf die Increment Methode im C# Code. Der `@code` Block in Zeile 7 ist der C# Code, welcher diese Komponente dynamisch macht. Hier ist die Variable count definiert und die Methode Increment, welche dieser Komponente interaktiv macht.
Razor hat auch eine Reihe an Keywords wie zum Beipsiel (nur Auszugsweise, bzw. die die wir verwendet haben):

Rechtschreibung: 'Beipsiel' -> 'Beispiel', 'Auszugsweise' -> 'auszugsweise'.

Razor hat auch eine Reihe an Keywords wie zum Beispiel (nur auszugsweise, bzw. jene, die wir verwendet haben):
Rechtschreibung: 'Beipsiel' -> 'Beispiel', 'Auszugsweise' -> 'auszugsweise'. ```suggestion Razor hat auch eine Reihe an Keywords wie zum Beispiel (nur auszugsweise, bzw. jene, die wir verwendet haben): ```
@@ -93,0 +132,4 @@
- inherits: Gibt die Superklasse der generierten C# Klasse an.
- using: Gibt die im C# Code benutzen/verfügbaren Namespaces an
- foreach: Für Wiederholungen im Markup
- if: Für verzweigungen im Markup

Rechtschreibung: 'verzweigungen' -> 'Verzweigungen'.

- if: Für Verzweigungen im Markup
Rechtschreibung: 'verzweigungen' -> 'Verzweigungen'. ```suggestion - if: Für Verzweigungen im Markup ```
@@ -93,2 +139,4 @@
### SignalR
### Kestrel
## Dependency injection

Rechtschreibung: 'injection' -> 'Injection' (Überschrift).

## Dependency Injection
Rechtschreibung: 'injection' -> 'Injection' (Überschrift). ```suggestion ## Dependency Injection ```

Rechtschreibung: 'dannach' -> 'danach'.

Beim Instanziieren einer Klasse werden alle im Konstruktor erwarteten Dependencies bereitgestellt, bzw. selbst instanziiert und danach bereitgestellt. [^4]
Rechtschreibung: 'dannach' -> 'danach'. ```suggestion Beim Instanziieren einer Klasse werden alle im Konstruktor erwarteten Dependencies bereitgestellt, bzw. selbst instanziiert und danach bereitgestellt. [^4] ```

Grammatik: 'ein Continuous-Integration-System' (Neutrum).

## Automatisierter Build und Release Prozess mithilfe von Gitea Actions.

Gitea, das Versionskontrollsystem dieser Diplomarbeit, hat ein Continuous-Integration-System eingebaut.
Grammatik: 'ein Continuous-Integration-System' (Neutrum). ```suggestion ## Automatisierter Build und Release Prozess mithilfe von Gitea Actions. Gitea, das Versionskontrollsystem dieser Diplomarbeit, hat ein Continuous-Integration-System eingebaut. ```

Rechtschreibung: 'bauen' -> 'Bauen' (Großschreibung nach dem Doppelpunkt/Spiegelstrich in diesem Kontext).

- ursprünglich: oqtane.framework
  > Zum Bauen und Verpacken in einen Docker Container und in die Registry pushen.
Rechtschreibung: 'bauen' -> 'Bauen' (Großschreibung nach dem Doppelpunkt/Spiegelstrich in diesem Kontext). ```suggestion - ursprünglich: oqtane.framework > Zum Bauen und Verpacken in einen Docker Container und in die Registry pushen. ```

🤖 Word Count Report

Word count for Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md

Word count: 2180

### 🤖 Word Count Report #### Word count for `Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md` Word count: 2180
Kocoder added 1 commit 2026-03-10 08:49:25 +00:00
Kommunikations zwischen FE und BE, SignalR, Produktion != Staging und Teamleitung und Downsing
All checks were successful
Gemini Writing Review / gemini-review (pull_request) Successful in 2m7s
Word Count / count-words (pull_request) Successful in 33s
eb5f9c614d
Kocoder closed this pull request 2026-03-10 08:49:58 +00:00

🤖 Word Count Report

Word count for Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md

Word count: 2488

### 🤖 Word Count Report #### Word count for `Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md` Word count: 2488
Kocoder reopened this pull request 2026-03-10 08:50:02 +00:00
gitea-actionsbot requested changes 2026-03-10 08:52:07 +00:00
gitea-actionsbot left a comment

🤖 Gemini Writing Review

I've found some areas for improvement in the documentation. Please see the inline comments below.

### 🤖 Gemini Writing Review I've found some areas for improvement in the documentation. Please see the inline comments below.

Grammatik: Genitiv von 'Projekt' ist im förmlichen Kontext vorzugsweise 'Projekts' oder 'Projektes'.

In diesem Abschnitt wird meine persönliche Aufgabenstellung im Rahmen des Projekts (`Alumnihub`) beschrieben.
Grammatik: Genitiv von 'Projekt' ist im förmlichen Kontext vorzugsweise 'Projekts' oder 'Projektes'. ```suggestion In diesem Abschnitt wird meine persönliche Aufgabenstellung im Rahmen des Projekts (`Alumnihub`) beschrieben. ```

Grammatik: Die 1. Person Singular von 'entwickeln' ist 'entwickle'.

Lernen von ASP.NET und der Entwicklung mit Blazor und Oqtane. Ich habe Interesse an dem Thema Webentwicklung. Privat entwickle ich schon seit Jahren viel mit React.JS.
Grammatik: Die 1. Person Singular von 'entwickeln' ist 'entwickle'. ```suggestion Lernen von ASP.NET und der Entwicklung mit Blazor und Oqtane. Ich habe Interesse an dem Thema Webentwicklung. Privat entwickle ich schon seit Jahren viel mit React.JS. ```

Stil/Grammatik: Kein Komma vor 'sowie'. 'Einfach' wirkt zudem etwas umgangssprachlich.

Mein Aufgabenbereich umfasst einerseits die Entwicklung eigener Module sowie das Bereitstellen der Services. Als Betriebssystem habe ich mich für Linux entschieden, da ich mit Linux im Serverumfeld die meisten und besten Erfahrungen gemacht habe.
Stil/Grammatik: Kein Komma vor 'sowie'. 'Einfach' wirkt zudem etwas umgangssprachlich. ```suggestion Mein Aufgabenbereich umfasst einerseits die Entwicklung eigener Module sowie das Bereitstellen der Services. Als Betriebssystem habe ich mich für Linux entschieden, da ich mit Linux im Serverumfeld die meisten und besten Erfahrungen gemacht habe. ```

Grammatik/Stil: 'Laufe' statt 'Lauf'. 'Abdriften' ist sehr umgangssprachlich.

Auch steht die Wahl der Programmiersprache und des CMS an. Nachdem wir im Unterricht fast ausschließlich mit C# entwickelt haben und nicht in eine komplett unbekannte Entwicklungsumgebung wechseln wollten, haben wir uns für Webentwicklung mit ASP.NET Core 9 und (Upgrade im Laufe der Diplomarbeit auf .NET Core 10) dem CMS Oqtane entschieden.
Grammatik/Stil: 'Laufe' statt 'Lauf'. 'Abdriften' ist sehr umgangssprachlich. ```suggestion Auch steht die Wahl der Programmiersprache und des CMS an. Nachdem wir im Unterricht fast ausschließlich mit C# entwickelt haben und nicht in eine komplett unbekannte Entwicklungsumgebung wechseln wollten, haben wir uns für Webentwicklung mit ASP.NET Core 9 und (Upgrade im Laufe der Diplomarbeit auf .NET Core 10) dem CMS Oqtane entschieden. ```

Rechtschreibung: 'Großen und Ganzen' wird großgeschrieben.

Viel Arbeit mit Partials, welche in der Admin Oberfläche geschieht, aber sehr gut dokumentiert. Im Großen und Ganzen wirkt Umbraco nicht so flexibel.
Rechtschreibung: 'Großen und Ganzen' wird großgeschrieben. ```suggestion Viel Arbeit mit Partials, welche in der Admin Oberfläche geschieht, aber sehr gut dokumentiert. Im Großen und Ganzen wirkt Umbraco nicht so flexibel. ```

Grammatik/Syntax: 'einen Windows Server' (Akkusativ), Wortwiederholung 'ich ich' und ein fehlendes Verb wie 'stellen'.

Platzhirsch. Kennt man, wird von der DNN Foundation gewartet. Arbeitet mit dem Dotnet Framework, welches nicht unter Linux läuft. Und einen Windows Server würde ich nicht einfach so ins Internet stellen, abgesehen von den Lizenzkosten, die anfallen würden.
Grammatik/Syntax: 'einen Windows Server' (Akkusativ), Wortwiederholung 'ich ich' und ein fehlendes Verb wie 'stellen'. ```suggestion Platzhirsch. Kennt man, wird von der DNN Foundation gewartet. Arbeitet mit dem Dotnet Framework, welches nicht unter Linux läuft. Und einen Windows Server würde ich nicht einfach so ins Internet stellen, abgesehen von den Lizenzkosten, die anfallen würden. ```

Grammatik: Genitiv 'des Oqtane Frameworks'.

Am Ende haben wir uns für das Oqtane Framework trotz seiner schlechten Dokumentation entschieden.
Grammatik: Genitiv 'des Oqtane Frameworks'. ```suggestion Am Ende haben wir uns für das Oqtane Framework trotz seiner schlechten Dokumentation entschieden. ```

Rechtschreibung: 'Implementierung' großschreiben und korrekte Endung.

2. Mit welcher speziellen Implementierung bekommen wir Support und haben Wissen im Team?
Rechtschreibung: 'Implementierung' großschreiben und korrekte Endung. ```suggestion 2. Mit welcher speziellen Implementierung bekommen wir Support und haben Wissen im Team? ```

Rechtschreibung: 'Erfahrungen' großschreiben. 'SQL-basiert' mit Bindestrich.

Es war von Anfang an klar, dass es ein SQL-basiertes System wird, da wir im Team nur mit SQL-basierten Systemen Erfahrungen haben. Außerdem unterstützt unser CMS (Oqtane) nur SQL-basierte Systeme. In der Linuxwelt kommen jetzt nur noch ein paar Datenbanken in die Auswahl: PostgreSQL, MySQL / MariaDB, SQLite. Da ist die Wahl auf PostgreSQL gefallen. Grund dafür war meine Vorerfahrung mit diesem DBMS, welche ich im Nebenjob errungen habe.
Rechtschreibung: 'Erfahrungen' großschreiben. 'SQL-basiert' mit Bindestrich. ```suggestion Es war von Anfang an klar, dass es ein SQL-basiertes System wird, da wir im Team nur mit SQL-basierten Systemen Erfahrungen haben. Außerdem unterstützt unser CMS (Oqtane) nur SQL-basierte Systeme. In der Linuxwelt kommen jetzt nur noch ein paar Datenbanken in die Auswahl: PostgreSQL, MySQL / MariaDB, SQLite. Da ist die Wahl auf PostgreSQL gefallen. Grund dafür war meine Vorerfahrung mit diesem DBMS, welche ich im Nebenjob errungen habe. ```

Rechtschreibung: Im Deutschen schreibt man eher 'Webseite'.

Ein `Module` (Modul) soll neue Funktionalitäten in das CMS hinzufügen und ein `Theme` soll die ganze Gestaltung der Webseite (die Shell) festlegen. [^6]
Rechtschreibung: Im Deutschen schreibt man eher 'Webseite'. ```suggestion Ein `Module` (Modul) soll neue Funktionalitäten in das CMS hinzufügen und ein `Theme` soll die ganze Gestaltung der Webseite (die Shell) festlegen. [^6] ```

Stil: 'Quellcode' statt 'Sourcecode' (optionaler Stilvorschlag für Deutsch).

Im Server-Projekt liegt der Quellcode, welcher serverseitig ausgeführt werden soll. In der Praxis bedeutet das: alle Repositories, Controller, Manager, Migrationen und Server-Services (entwickelt nach einem Interface definiert im Client) und Server-Startuplogik.
Stil: 'Quellcode' statt 'Sourcecode' (optionaler Stilvorschlag für Deutsch). ```suggestion Im Server-Projekt liegt der Quellcode, welcher serverseitig ausgeführt werden soll. In der Praxis bedeutet das: alle Repositories, Controller, Manager, Migrationen und Server-Services (entwickelt nach einem Interface definiert im Client) und Server-Startuplogik. ```

Rechtschreibung: Tippfehler in 'Startuplogik' und 'Interfaces'.

Im Client-Projekt liegen Code und Razor-Komponenten für den Client. Also Client-Startuplogik, Client-Services (+ Interfaces dafür, die Services hier sollen lediglich die Server-Services über HTTP aufrufen), Ressourcendateien (.resx), die Komponenten / das User Interface und die Moduldefinitionen für jedes Modul.
Rechtschreibung: Tippfehler in 'Startuplogik' und 'Interfaces'. ```suggestion Im Client-Projekt liegen Code und Razor-Komponenten für den Client. Also Client-Startuplogik, Client-Services (+ Interfaces dafür, die Services hier sollen lediglich die Server-Services über HTTP aufrufen), Ressourcendateien (.resx), die Komponenten / das User Interface und die Moduldefinitionen für jedes Modul. ```
@@ -76,1 +75,3 @@
## Systemarchitektur (Postgres / Oqtane / Nginx )
## Systemarchitektur (Postgres / Oqtane / Nginx)
In diesem Kapitel erkläre ich wie die ausgewählten Komponenten zusammenspielen. Wir verwenden NginX als Reverse Proxy, welcher bei uns die SSL Terminierung macht. Das Zertifikat, welches verwendet wird, wird von Let's Encrypt bereit gestellt und mitels HTTP-Challanges und dem Certbot auf dem Server aktualisiert und verwaltet. Oqtane selber läuft als Systemd-Service im Kestrel Backend. Kestrel ist ein kleiner Webserver, welcher in das ASP.NET Core Framework eingebaut worden ist. Oqtane (bzw. der ASP.NET Core Server "Kestrel") hört auf der Loopback IP und Port 5000. Damit ist Oqtane nur durch NginX erreichbar. PostgreSQL ist die Datenbank in dem System: Sie hört wieder auf der Loopback IP und Port 5432.

Grammatik/Rechtschreibung: Komma nach 'erkläre ich'. 'bereitgestellt' zusammen, 'mittels' mit zwei t, 'Challenges' korrigiert.

In diesem Kapitel erkläre ich, wie die ausgewählten Komponenten zusammenspielen. Wir verwenden Nginx als Reverse Proxy, welcher bei uns die SSL-Terminierung macht. Das Zertifikat, welches verwendet wird, wird von Let's Encrypt bereitgestellt und mittels HTTP-Challenges und dem Certbot auf dem Server aktualisiert und verwaltet. Oqtane selbst läuft als Systemd-Service im Kestrel-Backend. Kestrel ist ein kleiner Webserver, welcher in das ASP.NET Core Framework eingebaut worden ist. Oqtane (bzw. der ASP.NET Core Server 'Kestrel') hört auf der Loopback-IP und Port 5000. Damit ist Oqtane nur durch Nginx erreichbar. PostgreSQL ist die Datenbank im System: Sie hört wieder auf der Loopback-IP und Port 5432.
Grammatik/Rechtschreibung: Komma nach 'erkläre ich'. 'bereitgestellt' zusammen, 'mittels' mit zwei t, 'Challenges' korrigiert. ```suggestion In diesem Kapitel erkläre ich, wie die ausgewählten Komponenten zusammenspielen. Wir verwenden Nginx als Reverse Proxy, welcher bei uns die SSL-Terminierung macht. Das Zertifikat, welches verwendet wird, wird von Let's Encrypt bereitgestellt und mittels HTTP-Challenges und dem Certbot auf dem Server aktualisiert und verwaltet. Oqtane selbst läuft als Systemd-Service im Kestrel-Backend. Kestrel ist ein kleiner Webserver, welcher in das ASP.NET Core Framework eingebaut worden ist. Oqtane (bzw. der ASP.NET Core Server 'Kestrel') hört auf der Loopback-IP und Port 5000. Damit ist Oqtane nur durch Nginx erreichbar. PostgreSQL ist die Datenbank im System: Sie hört wieder auf der Loopback-IP und Port 5432. ```
@@ -90,3 +92,3 @@
```
## Websockets und HTTP 1.1
Zusätzlich gab es einen Administrationszugang zu den Servern, welcher über SSH möglich war. Dieser wurde für die Installation und Konfiguration der einzelnen Komponenten verwendet. Bei Hetzner war dieser Zugang nur über eine Wireguard VPN erreichbar. Bei der Schule war dieser Zugang direkt (über einen Hight-Port) möglich. Und bei LiveDesign war dieser Zugang wieder über eine VPN geregelt. Anfänglich mit SSL VPN, später mit einem IPSEC / Strongswan.

Rechtschreibung: 'High-Port' statt 'Hight-Port'.

Zusätzlich gab es einen Administrationszugang zu den Servern, welcher über SSH möglich war. Dieser wurde für die Installation und Konfiguration der einzelnen Komponenten verwendet. Bei Hetzner war dieser Zugang nur über eine Wireguard VPN erreichbar. Bei der Schule war dieser Zugang direkt (über einen High-Port) möglich. Und bei LiveDesign war dieser Zugang wieder über eine VPN geregelt. Anfänglich mit SSL VPN, später mit einem IPSEC / Strongswan.
Rechtschreibung: 'High-Port' statt 'Hight-Port'. ```suggestion Zusätzlich gab es einen Administrationszugang zu den Servern, welcher über SSH möglich war. Dieser wurde für die Installation und Konfiguration der einzelnen Komponenten verwendet. Bei Hetzner war dieser Zugang nur über eine Wireguard VPN erreichbar. Bei der Schule war dieser Zugang direkt (über einen High-Port) möglich. Und bei LiveDesign war dieser Zugang wieder über eine VPN geregelt. Anfänglich mit SSL VPN, später mit einem IPSEC / Strongswan. ```
@@ -93,0 +95,4 @@
## Entwicklung mit ASP.NET (Was ist Blazor? / Was ist Razor? / Kestrel)
### Blazor [^7]
Blazor ist ein kostenloses und quelloffenes Web-Framework, welches es Möglich macht, Benutzeroberflächen für Web-Browser basierend auf C# and HTML zu erstellen. Es wird von Microsoft als teil des ASP.NET Core Frameworks entwickelt.

Rechtschreibung/Stil: 'möglich' kleinschreiben (Adjektiv). 'und' statt 'and'. 'Teil' großschreiben.

Blazor ist ein kostenloses und quelloffenes Web-Framework, welches es möglich macht, Benutzeroberflächen für Web-Browser basierend auf C# und HTML zu erstellen. Es wird von Microsoft als Teil des ASP.NET Core Frameworks entwickelt. 
Rechtschreibung/Stil: 'möglich' kleinschreiben (Adjektiv). 'und' statt 'and'. 'Teil' großschreiben. ```suggestion Blazor ist ein kostenloses und quelloffenes Web-Framework, welches es möglich macht, Benutzeroberflächen für Web-Browser basierend auf C# und HTML zu erstellen. Es wird von Microsoft als Teil des ASP.NET Core Frameworks entwickelt. ```
@@ -93,0 +99,4 @@
Blazor hat mehrere Hosting-Modelle:
- Blazor Web App: Hier wird die Web App als Teil einer ASP.NET Core Anwendung bereitgestellt. Hier gibt es mehrere Render Modi:
- Static Server: Die Komponente wird serverseitig "gerenderet" und besitzt keine Interaktivität. Das istder Default `RenderMode`

Rechtschreibung: Fehlendes Leerzeichen in 'ist der'.

  - Static Server: Die Komponente wird serverseitig "gerendert" und besitzt keine Interaktivität. Das ist der Default `RenderMode`
Rechtschreibung: Fehlendes Leerzeichen in 'ist der'. ```suggestion - Static Server: Die Komponente wird serverseitig "gerendert" und besitzt keine Interaktivität. Das ist der Default `RenderMode` ```
@@ -93,0 +103,4 @@
- Interative Server: Die Komponente wird serverseitig "gerendert", diesmal ist sie jedoch interaktiv. Das bedeutet: Man kann mithilfe von C# den Zustand der Seite dynamisch bearbeiten. Diese Zustandsänderungen werden serverseitig bearbeitet. Hierbei kommunizieren Server und Client mithilfe von SignalR über WebSockets miteinander.
- Interactive WebAssembly: Die Komponente wird clientseitig, also im Browser, "gerendert". Damit der Blazor C# Code auch im Browser ausgeführt werden kann wird dieser in WebAssembly kompiliert.
- Interactive Auto: Im `Interactive Auto` Modul wird bei dem initialen Besuch der Website der `Interactive Server` Modus gewählt und im Hintergrund wird der WebAssembly-Build heruntergeladen, damit bei weiteren Besuchen der Seite der `Interactive WebAssembly` Modus gewählt werden kann.
- Hybrid: Dieser Modus ist der einzige, welcher nicht innerhalb einer Blazor Web App läuft, sondern in einem WebView einer Nativen App. Dabei wird innerhalb des Mutterprozesses, ganz ohne WebServer. Das ganze Funktioniert in WPF und WinForms Apps und in nativen mobilen Apps für Android und iOS mithilfe von .NET MAUI.

Rechtschreibung: Adjektiv 'nativen' kleinschreiben. 'Das Ganze funktioniert' groß/klein.

- Hybrid: Dieser Modus ist der einzige, welcher nicht innerhalb einer Blazor Web App läuft, sondern in einem WebView einer nativen App. Dabei läuft dies innerhalb des Mutterprozesses, ganz ohne Webserver. Das Ganze funktioniert in WPF- und WinForms-Apps und in nativen mobilen Apps für Android und iOS mithilfe von .NET MAUI.
Rechtschreibung: Adjektiv 'nativen' kleinschreiben. 'Das Ganze funktioniert' groß/klein. ```suggestion - Hybrid: Dieser Modus ist der einzige, welcher nicht innerhalb einer Blazor Web App läuft, sondern in einem WebView einer nativen App. Dabei läuft dies innerhalb des Mutterprozesses, ganz ohne Webserver. Das Ganze funktioniert in WPF- und WinForms-Apps und in nativen mobilen Apps für Android und iOS mithilfe von .NET MAUI. ```
@@ -93,0 +105,4 @@
- Interactive Auto: Im `Interactive Auto` Modul wird bei dem initialen Besuch der Website der `Interactive Server` Modus gewählt und im Hintergrund wird der WebAssembly-Build heruntergeladen, damit bei weiteren Besuchen der Seite der `Interactive WebAssembly` Modus gewählt werden kann.
- Hybrid: Dieser Modus ist der einzige, welcher nicht innerhalb einer Blazor Web App läuft, sondern in einem WebView einer Nativen App. Dabei wird innerhalb des Mutterprozesses, ganz ohne WebServer. Das ganze Funktioniert in WPF und WinForms Apps und in nativen mobilen Apps für Android und iOS mithilfe von .NET MAUI.
Razor-Komponenten (in dieser Arbeit, sowie Umgangssprachlich, auch oft nur Komponenten genannt) sind der Grundbaustein für Blazor Web Apps. Sie bestehen aus HTML, welches mit der Verwendung von inline C# beeinflusst werden kann. Das Blazor stellt sicher, dass das gerenderte Markup aktualisiert wird, wenn sicher der Status der Komponente ändert. Dieser Code kann entweder vollständig in einer .razor Dateil liegen, oder in einer seperaten Code-Behind-Datei und der benutzer einer partiellen Klasse. Inline C# Code wird mithilfe von dem `@`- Zeichen markiert. Hier ist ein Beispiel für einen einfachen Counter:

Rechtschreibung: 'sich' statt 'sicher'. 'Datei' statt 'Dateil'. 'separaten' statt 'seperaten'. 'Benutzung' statt 'benutzer'. 'mithilfe des' (Genitiv).

Razor-Komponenten (in dieser Arbeit sowie umgangssprachlich auch oft nur Komponenten genannt) sind der Grundbaustein für Blazor Web Apps. Sie bestehen aus HTML, welches durch die Verwendung von Inline-C# beeinflusst werden kann. Blazor stellt sicher, dass das gerenderte Markup aktualisiert wird, wenn sich der Status der Komponente ändert. Dieser Code kann entweder vollständig in einer .razor-Datei liegen oder in einer separaten Code-Behind-Datei unter Benutzung einer partiellen Klasse. Inline-C#-Code wird mithilfe des `@`-Zeichens markiert. Hier ist ein Beispiel für einen einfachen Counter:
Rechtschreibung: 'sich' statt 'sicher'. 'Datei' statt 'Dateil'. 'separaten' statt 'seperaten'. 'Benutzung' statt 'benutzer'. 'mithilfe des' (Genitiv). ```suggestion Razor-Komponenten (in dieser Arbeit sowie umgangssprachlich auch oft nur Komponenten genannt) sind der Grundbaustein für Blazor Web Apps. Sie bestehen aus HTML, welches durch die Verwendung von Inline-C# beeinflusst werden kann. Blazor stellt sicher, dass das gerenderte Markup aktualisiert wird, wenn sich der Status der Komponente ändert. Dieser Code kann entweder vollständig in einer .razor-Datei liegen oder in einer separaten Code-Behind-Datei unter Benutzung einer partiellen Klasse. Inline-C#-Code wird mithilfe des `@`-Zeichens markiert. Hier ist ein Beispiel für einen einfachen Counter: ```
@@ -93,0 +125,4 @@
}
```
Mit`@count` in Zeile 3 wird der Wert der Variablen count in den `<p>` Tag mit eingebaut. Mit `@onclick="Increment"` in Zeile 5 wird die onclick Property vom `<button>`Tag auf die Increment Methode im C# Code. Der `@code` Block in Zeile 7 ist der C# Code, welcher diese Komponente dynamisch macht. Hier ist die Variable count definiert und die Methode Increment, welche dieser Komponente interaktiv macht.

Grammatik: 'welche diese Komponente' (Akkusativ). 'onclick-Property des -Tags'.

Mit `@count` in Zeile 3 wird der Wert der Variablen 'count' in den `<p>`-Tag eingebaut. Mit `@onclick="Increment"` in Zeile 5 wird die onclick-Property des `<button>`-Tags auf die Increment-Methode im C#-Code verwiesen. Der `@code`-Block in Zeile 7 ist der C#-Code, welcher diese Komponente dynamisch macht. Hier ist die Variable 'count' definiert und die Methode 'Increment', welche diese Komponente interaktiv macht. 

Grammatik: 'welche diese Komponente' (Akkusativ). 'onclick-Property des <button>-Tags'. ```suggestion Mit `@count` in Zeile 3 wird der Wert der Variablen 'count' in den `<p>`-Tag eingebaut. Mit `@onclick="Increment"` in Zeile 5 wird die onclick-Property des `<button>`-Tags auf die Increment-Methode im C#-Code verwiesen. Der `@code`-Block in Zeile 7 ist der C#-Code, welcher diese Komponente dynamisch macht. Hier ist die Variable 'count' definiert und die Methode 'Increment', welche diese Komponente interaktiv macht. ```
@@ -93,0 +127,4 @@
Mit`@count` in Zeile 3 wird der Wert der Variablen count in den `<p>` Tag mit eingebaut. Mit `@onclick="Increment"` in Zeile 5 wird die onclick Property vom `<button>`Tag auf die Increment Methode im C# Code. Der `@code` Block in Zeile 7 ist der C# Code, welcher diese Komponente dynamisch macht. Hier ist die Variable count definiert und die Methode Increment, welche dieser Komponente interaktiv macht.
Razor hat auch eine Reihe an Keywords wie zum Beipsiel (nur Auszugsweise, bzw. die die wir verwendet haben):

Rechtschreibung: 'Beispiel' statt 'Beipsiel'.

Razor hat auch eine Reihe an Keywords wie zum Beispiel (nur auszugsweise bzw. die, die wir verwendet haben):
Rechtschreibung: 'Beispiel' statt 'Beipsiel'. ```suggestion Razor hat auch eine Reihe an Keywords wie zum Beispiel (nur auszugsweise bzw. die, die wir verwendet haben): ```
@@ -93,0 +132,4 @@
- inherits: Gibt die Superklasse der generierten C# Klasse an.
- using: Gibt die im C# Code benutzen/verfügbaren Namespaces an
- foreach: Für Wiederholungen im Markup
- if: Für verzweigungen im Markup

Rechtschreibung: 'Verzweigungen' großschreiben.

- if: Für Verzweigungen im Markup
Rechtschreibung: 'Verzweigungen' großschreiben. ```suggestion - if: Für Verzweigungen im Markup ```
@@ -93,0 +136,4 @@
[^7]: https://en.wikipedia.org/wiki/Blazor
### Kommunikations zwischen Front und Backend

Rechtschreibung: 'Kommunikation' statt 'Kommunikations'.

### Kommunikation zwischen Front- und Backend
Rechtschreibung: 'Kommunikation' statt 'Kommunikations'. ```suggestion ### Kommunikation zwischen Front- und Backend ```
@@ -93,0 +140,4 @@
Wie Front- und Backend miteinander interagieren hängt hauptsächlich vom Render Modus ab. Oqtane kann auf verschiedene Arten betrieben werden. Hierbei ist es dem Modulentwickler ziemlich egal, welche Art der Kommunikation (WebSockets, HTTP Long-Polling, REST) verwendet wird.
#### SignalR
SignalR ist eine Libary aus für das ASP.NET Framework, welche es möglich macht Server zu Client komminikation zu betreiben. Oqtane verwendet im `Interactive Server (SignalR)` Render-Modus verwendet wird.

Rechtschreibung/Stil: 'Library'. 'Kommunikation'. 'verwendet wird' doppelt gemoppelt.

SignalR ist eine Library für das ASP.NET Framework, welche es möglich macht, Server-zu-Client-Kommunikation zu betreiben. Oqtane verwendet diesen Dienst im `Interactive Server (SignalR)`-Render-Modus.
Rechtschreibung/Stil: 'Library'. 'Kommunikation'. 'verwendet wird' doppelt gemoppelt. ```suggestion SignalR ist eine Library für das ASP.NET Framework, welche es möglich macht, Server-zu-Client-Kommunikation zu betreiben. Oqtane verwendet diesen Dienst im `Interactive Server (SignalR)`-Render-Modus. ```

Rechtschreibung: 'danach' statt 'dannach'.

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: 'danach' statt 'dannach'. ```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] ```

Grammatik: 'eine Dependency' (feminin).

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).
Grammatik: 'eine Dependency' (feminin). ```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). ```

Rechtschreibung: 'danach' statt 'dannach'.

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)). 
Rechtschreibung: 'danach' statt 'dannach'. ```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)). ```

Rechtschreibung: 'aufgebaut' kleinschreiben.

Die meisten Pipelines sind folgendermaßen aufgebaut:
Rechtschreibung: 'aufgebaut' kleinschreiben. ```suggestion Die meisten Pipelines sind folgendermaßen aufgebaut: ```
@@ -234,1 +282,4 @@
## Produktion != Staging
Ein Learning, welches doch relativ schnell aufkam ist im Bereich der IT eigentlich kein unbekanntes. Wir hatten dieses Learning relativ bald, im Frühling 2025, als die ersten Probleme mit dem Deployment von Oqtane aufkamen. Oqtane war zwar in unserer Entwicklungsumgebung sehr einfach zum einrichten gewesen, das Deployment in der Cloud vom Hetzner war jedoch geplagt von Problemen. Im Zeitraum von Mai bis Okober hatten wir keine laufende Produktivumgebung. Dadurch sind wir mit dieser Diplomarbeit auch in [Zeitverzug](#Arbeitszeiteinschätzung-und-verzug) gekommen. Hätte ich mich vor dem Start der Diplomarbeit mit dem Deployment von Oqtane auseinander gesetzt, dann wäre das in [Probleme mit Oqtane](#Probleme mit Oqtane) beschriebene Problem früher aufgekommen und der Zeitverzug wäre nicht so groß, oder noch ganz vermeidbar gewesen.

Rechtschreibung: 'einzurichten' statt 'zum einrichten'. 'Oktober'. 'auseinandergesetzt'.

Ein Learning, welches doch relativ schnell aufkam, ist im Bereich der IT eigentlich kein unbekanntes. Wir hatten dieses Learning relativ bald, im Frühling 2025, als die ersten Probleme mit dem Deployment von Oqtane aufkamen. Oqtane war zwar in unserer Entwicklungsumgebung sehr einfach einzurichten gewesen, das Deployment in der Cloud von Hetzner war jedoch geplagt von Problemen. Im Zeitraum von Mai bis Oktober hatten wir keine laufende Produktivumgebung. Dadurch sind wir mit dieser Diplomarbeit auch in [Zeitverzug](#Arbeitszeiteinschätzung-und-verzug) gekommen. Hätte ich mich vor dem Start der Diplomarbeit mit dem Deployment von Oqtane auseinandergesetzt, dann wäre das in [Probleme mit Oqtane](#Probleme mit Oqtane) beschriebene Problem früher aufgekommen und der Zeitverzug wäre nicht so groß oder noch ganz vermeidbar gewesen.
Rechtschreibung: 'einzurichten' statt 'zum einrichten'. 'Oktober'. 'auseinandergesetzt'. ```suggestion Ein Learning, welches doch relativ schnell aufkam, ist im Bereich der IT eigentlich kein unbekanntes. Wir hatten dieses Learning relativ bald, im Frühling 2025, als die ersten Probleme mit dem Deployment von Oqtane aufkamen. Oqtane war zwar in unserer Entwicklungsumgebung sehr einfach einzurichten gewesen, das Deployment in der Cloud von Hetzner war jedoch geplagt von Problemen. Im Zeitraum von Mai bis Oktober hatten wir keine laufende Produktivumgebung. Dadurch sind wir mit dieser Diplomarbeit auch in [Zeitverzug](#Arbeitszeiteinschätzung-und-verzug) gekommen. Hätte ich mich vor dem Start der Diplomarbeit mit dem Deployment von Oqtane auseinandergesetzt, dann wäre das in [Probleme mit Oqtane](#Probleme mit Oqtane) beschriebene Problem früher aufgekommen und der Zeitverzug wäre nicht so groß oder noch ganz vermeidbar gewesen. ```
@@ -235,0 +286,4 @@
## Teamleitung (Motivation / Downsizing)
Nachdem ich mich von Anfang an volkommen in das Deploymentproblem von Oqtane gestürzt habe, habe ich meine Rolle als Teamleitung etwas schleifen gelassen. Dadurch fehlte bei einigen Teammitgliedern initial die Identifikation mit dem Projekt und in weitererfolge auch die Motivation an diesem Projekt mitzuarbeiten. Nachdem im Verlauf des Frühlings und über den Sommer von der hälfte des Teams trotz Besprechungen und Mahnungen keine Beiträge zu dem Projekt kamen haben Hr. Prof. Gürth und ich uns dazu entschieden uns von 2 Personen vor unterschreiben des Projektantrages zu trennen. Grund dazu war die Angst, die mangelnde Motivation zieht das restliche Team mit hinunter. Wir wollten uns trotz des Downsizings nicht an Funktionalitäten sparen und haben uns für das nächste halbe bis dreiviertel Jahr einen ziemlich strikten Zeiplan vorgenommen.

Rechtschreibung: 'vollkommen', 'Hälfte', 'Unterschreiben', 'Zeitplan'.

Nachdem ich mich von Anfang an vollkommen in das Deploymentproblem von Oqtane gestürzt habe, habe ich meine Rolle als Teamleitung etwas schleifen gelassen. Dadurch fehlte bei einigen Teammitgliedern initial die Identifikation mit dem Projekt und in weiterer Folge auch die Motivation, an diesem Projekt mitzuarbeiten. Nachdem im Verlauf des Frühlings und über den Sommer von der Hälfte des Teams trotz Besprechungen und Mahnungen keine Beiträge zu dem Projekt kamen, haben Hr. Prof. Gürth und ich uns dazu entschieden, uns von 2 Personen vor dem Unterschreiben des Projektantrages zu trennen. Grund dazu war die Angst, die mangelnde Motivation zieht das restliche Team mit hinunter. Wir wollten uns trotz des Downsizings nicht an Funktionalitäten sparen und haben uns für das nächste halbe bis dreiviertel Jahr einen ziemlich strikten Zeitplan vorgenommen.
Rechtschreibung: 'vollkommen', 'Hälfte', 'Unterschreiben', 'Zeitplan'. ```suggestion Nachdem ich mich von Anfang an vollkommen in das Deploymentproblem von Oqtane gestürzt habe, habe ich meine Rolle als Teamleitung etwas schleifen gelassen. Dadurch fehlte bei einigen Teammitgliedern initial die Identifikation mit dem Projekt und in weiterer Folge auch die Motivation, an diesem Projekt mitzuarbeiten. Nachdem im Verlauf des Frühlings und über den Sommer von der Hälfte des Teams trotz Besprechungen und Mahnungen keine Beiträge zu dem Projekt kamen, haben Hr. Prof. Gürth und ich uns dazu entschieden, uns von 2 Personen vor dem Unterschreiben des Projektantrages zu trennen. Grund dazu war die Angst, die mangelnde Motivation zieht das restliche Team mit hinunter. Wir wollten uns trotz des Downsizings nicht an Funktionalitäten sparen und haben uns für das nächste halbe bis dreiviertel Jahr einen ziemlich strikten Zeitplan vorgenommen. ```

🤖 Word Count Report

Word count for Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md

Word count: 2488

### 🤖 Word Count Report #### Word count for `Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md` Word count: 2488
Kocoder added 1 commit 2026-03-10 18:59:02 +00:00
Arbeitszeiteinschätzung
All checks were successful
Word Count / count-words (pull_request) Successful in 34s
dbb86031b4

🤖 Word Count Report

Word count for Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md

Word count: 2934

### 🤖 Word Count Report #### Word count for `Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md` Word count: 2934
Kocoder added 1 commit 2026-03-10 20:47:35 +00:00
Update Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md
All checks were successful
Word Count / count-words (pull_request) Successful in 33s
4de15f7889

🤖 Word Count Report

Word count for Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md

Word count: 3196

### 🤖 Word Count Report #### Word count for `Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md` Word count: 3196
Kocoder added 1 commit 2026-03-10 21:03:19 +00:00
Update Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md
All checks were successful
Word Count / count-words (pull_request) Successful in 32s
50aeb848e7

🤖 Word Count Report

Word count for Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md

Word count: 3357

### 🤖 Word Count Report #### Word count for `Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md` Word count: 3357
Kocoder added 1 commit 2026-03-13 20:25:39 +00:00
New: Token Lifetime
All checks were successful
Word Count / count-words (pull_request) Successful in 31s
14f46d11a1

🤖 Word Count Report

Word count for Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md

Word count: 3716

### 🤖 Word Count Report #### Word count for `Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md` Word count: 3716
Kocoder added 1 commit 2026-03-13 21:23:32 +00:00
New: Reporting System
All checks were successful
Word Count / count-words (pull_request) Successful in 31s
7bdcc8eaec

🤖 Word Count Report

Word count for Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md

Word count: 4049

### 🤖 Word Count Report #### Word count for `Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md` Word count: 4049
Kocoder added 1 commit 2026-03-13 21:33:47 +00:00
Update: Reporting System
All checks were successful
Word Count / count-words (pull_request) Successful in 32s
78107413a5

🤖 Word Count Report

Word count for Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md

Word count: 4060

### 🤖 Word Count Report #### Word count for `Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md` Word count: 4060
Kocoder added 1 commit 2026-03-17 12:43:09 +00:00
Individueller Teil - Konstantin Hintermayer: Korrektur 1/x
All checks were successful
Word Count / count-words (pull_request) Successful in 34s
f6e2ca7c9b

🤖 Word Count Report

Word count for Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md

Word count: 4047

### 🤖 Word Count Report #### Word count for `Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md` Word count: 4047
Kocoder added 1 commit 2026-03-17 12:52:30 +00:00
Umschreiben der CMS Vergleiche
All checks were successful
Word Count / count-words (pull_request) Successful in 32s
169a085a73

🤖 Word Count Report

Word count for Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md

Word count: 4080

### 🤖 Word Count Report #### Word count for `Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md` Word count: 4080
Kocoder added 1 commit 2026-03-18 10:54:03 +00:00
New: Dependency Injection Grundlagen & Einleitung
All checks were successful
Word Count / count-words (pull_request) Successful in 33s
20df216b08

🤖 Word Count Report

Word count for Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md

Word count: 4207

### 🤖 Word Count Report #### Word count for `Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md` Word count: 4207
Kocoder added 1 commit 2026-03-18 11:44:57 +00:00
Quellen: Tokenlifetime und E-Mail Tippfehler und Workaround tippfehler
All checks were successful
Word Count / count-words (pull_request) Successful in 32s
2fc154548f

🤖 Word Count Report

Word count for Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md

Word count: 4243

### 🤖 Word Count Report #### Word count for `Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md` Word count: 4243
Kocoder added 1 commit 2026-03-18 12:26:51 +00:00
Update: TOC / Struktur in dem Buch
All checks were successful
Word Count / count-words (pull_request) Successful in 32s
0493a0c527

🤖 Word Count Report

Word count for Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md

Word count: 4274

### 🤖 Word Count Report #### Word count for `Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md` Word count: 4274
Kocoder added 1 commit 2026-03-18 12:44:37 +00:00
Update: Motivation
All checks were successful
Word Count / count-words (pull_request) Successful in 32s
6d1d98f041

🤖 Word Count Report

Word count for Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md

Word count: 4318

### 🤖 Word Count Report #### Word count for `Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md` Word count: 4318
Kocoder added 1 commit 2026-03-18 17:36:13 +00:00
New: Projektmanagement: Git und Gitea
All checks were successful
Word Count / count-words (pull_request) Successful in 32s
e28305c0f0

🤖 Word Count Report

Word count for Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md

Word count: 5030

### 🤖 Word Count Report #### Word count for `Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md` Word count: 5030
Kocoder added 1 commit 2026-03-18 17:57:03 +00:00
New: EventRegistration Modul
All checks were successful
Word Count / count-words (pull_request) Successful in 32s
e846d340b9

🤖 Word Count Report

Word count for Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md

Word count: 5328

### 🤖 Word Count Report #### Word count for `Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md` Word count: 5328
Kocoder added 1 commit 2026-03-18 17:59:24 +00:00
Update: Überschriftsnummerierung
All checks were successful
Word Count / count-words (pull_request) Successful in 31s
8c72e797e5

🤖 Word Count Report

Word count for Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md

Word count: 5328

### 🤖 Word Count Report #### Word count for `Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md` Word count: 5328
Kocoder added 1 commit 2026-03-18 20:03:48 +00:00
New: Schwarzes Brett
All checks were successful
Word Count / count-words (pull_request) Successful in 32s
c4a314ae42

🤖 Word Count Report

Word count for Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md

Word count: 5668

### 🤖 Word Count Report #### Word count for `Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md` Word count: 5668
Kocoder added 1 commit 2026-03-18 20:04:23 +00:00
Update Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md
All checks were successful
Word Count / count-words (pull_request) Successful in 31s
999592d70f

🤖 Word Count Report

Word count for Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md

Word count: 5668

### 🤖 Word Count Report #### Word count for `Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md` Word count: 5668
Kocoder added 1 commit 2026-03-18 20:57:59 +00:00
Fix: Typos and move Sources into the end
All checks were successful
Word Count / count-words (pull_request) Successful in 32s
afd1f3ba2e

🤖 Word Count Report

Word count for Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md

Word count: 5677

### 🤖 Word Count Report #### Word count for `Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md` Word count: 5677
Kocoder force-pushed kh-blazor-razor from afd1f3ba2e to 43f5104a4e 2026-03-18 21:14:14 +00:00 Compare

🤖 Word Count Report

Word count for Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md

Word count: 5744

### 🤖 Word Count Report #### Word count for `Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md` Word count: 5744
Kocoder added 1 commit 2026-03-18 21:17:22 +00:00
Fix: Broken commit marker
All checks were successful
Word Count / count-words (pull_request) Successful in 31s
4559b758a7

🤖 Word Count Report

Word count for Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md

Word count: 5677

### 🤖 Word Count Report #### Word count for `Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md` Word count: 5677
Kocoder merged commit a2c756e4de into main 2026-03-19 07:22:47 +00:00
Sign in to join this conversation.
No Reviewers
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Diplomarbeit-Absolventenverein/pm#66