New: Reporting System
All checks were successful
Word Count / count-words (pull_request) Successful in 31s
All checks were successful
Word Count / count-words (pull_request) Successful in 31s
This commit is contained in:
@@ -353,5 +353,51 @@ Es gibt 2 Möglichkeiten, wie man dieses Problem Lösen kann:
|
|||||||
|
|
||||||
### Reporting System
|
### Reporting System
|
||||||
|
|
||||||
|
Eine weitere Anforderung der Diplomarbeit war es Einträge in Modulen wie der `Hall of Fame`, dem `Schwarzen Brett` und dem Premium Bereich (`Engineer Applications`) melden zu können. Am Anfang war es wichtig, dass jeder Schnell vorrankommt, allerdings haben wir die Kommunikation Teamintern ein wenig verschlafen und dadurch ein paar Funktionen doppelt geschrieben. Dadurch kam es zu inkonsistenzen in der Verwendung der Reporting Systeme.
|
||||||
|
|
||||||
|
Angestrebt wurde folgender Ablauf für das Melden eines Eintrags:
|
||||||
|
```mermaid
|
||||||
|
sequenceDiagram
|
||||||
|
participant Module
|
||||||
|
actor User
|
||||||
|
participant ReportingComponent
|
||||||
|
participant ReportingHandler
|
||||||
|
User->>+Module: View: Entity
|
||||||
|
User->>+ReportingComponent: Report current Entity
|
||||||
|
|
||||||
|
rect rgba(0, 0, 0, 0)
|
||||||
|
ReportingComponent->>+User: Ask for reason
|
||||||
|
User->>-ReportingComponent: Enters Reason
|
||||||
|
end
|
||||||
|
|
||||||
|
ReportingComponent->>+ReportingHandler: New Report (includes entity and reason)
|
||||||
|
ReportingComponent->>-User: Done
|
||||||
|
```
|
||||||
|
|
||||||
|
Im oben dargestellten Ablaufdiagram werden das ReportingComponent und der ReportingHandler vom Reporting System über Dependency Injection bereitgestellt, nicht vom Modul selbst. Dadurch erreichen wir eine bessere Trnnung und halten das S in SOLID ein: `Single responsibility`. Die Module sind jetzt nicht mehr für das Reporting selber verantwortlich, sondern müssen nur das Reportings System einbinden.
|
||||||
|
|
||||||
|
Damit DI funktioniert muss der DI Consumer (`also das Modul, welches das Reporting System einbinden möchte`) das Interface zur Kompilierzeit sehen. Um das zu erreichen haben wir eine neue Klassenbibliothek erstellt: Sie heißt Interfaces wird per Gitea Actions automatisch in ein Nuget Paket gebaut und in der `Gitea Actions Nuget Registry` veröffentlicht. Dieses Nuget Paket wird dann in jedem Modul installiert und damit kann man Modulübergreifend auf die Services und das IReporting Component zugreifen.
|
||||||
|
|
||||||
|
Die Implementierung des IReportingComponents stellt nur eine Property (`ReportType`, welche den TypeName der Razor Komponente zurückliefert, damit Dynamic Component sie laden kann) und eine Methode (`ConstructParameterList`, welche das Parameter Dictionary erstellt. Nur zwecks Typensicherheit eingefügt) bereit. Mit dem Dynamic Component von Razor ist es möglich, per C# Code unterschiedliche Komponenten zu rendern.
|
||||||
|
|
||||||
|
```razor
|
||||||
|
@inject IReportUI ReportingComponent
|
||||||
|
|
||||||
|
<DynamicComponent Type="@ReportingComponent.ReportType" Parameters="@ReportingComponent.ConstructParameterList(_item, RenderModeBoundary)"/>
|
||||||
|
|
||||||
|
@code {
|
||||||
|
private IReportable _item;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
IReportUI muss auch bereitgestellt werden, dass passiert im Startup.cs des Reporting Moduls (Admin Modul)
|
||||||
|
|
||||||
|
```c#
|
||||||
|
if (!services.Any(s => s.ServiceType == typeof(IReportUI)))
|
||||||
|
{
|
||||||
|
services.AddScoped<IReportUI, ReportComponent>();
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## Event Registration
|
## Event Registration
|
||||||
## Schwarzes Brett
|
## Schwarzes Brett
|
||||||
Reference in New Issue
Block a user