Dokument-Status: Entwurf
Erstellt: 2026-04-18
Betrifft: InventarWorkerCommon/Services/Database/SqliteDbService.cs, InventarWorkerCommon/Services/Database/PgSqlDbService.cs, InventarWorkerCommon/Services/Common/Initialize.cs, HarvesterWorkerService/Worker.cs
Prioritaet: Mittel (Architektur-Verbesserung, Voraussetzung fuer flexiblen Provider-Wechsel)
Herkunft: Review des Lastenhefts "Vervollstaendigung der PostgreSQL-Implementierung", Punkt 6
Abhaengigkeit: Setzt die abgeschlossene PostgreSQL-Paritaet voraus (Lastenheft_PostgreSQL_Implementation.md)
Reihenfolge: 3 von 5
| Nr. | Lastenheft | Abhaengigkeit |
|---|---|---|
| 1 | Lastenheft_PostgreSQL_Implementation.md |
Keine |
| 2 | Lastenheft_SQLite_ViewQuery_Bugfix.md |
Keine (unabhaengig, aber nach Nr. 1 geplant) |
| 3 | Lastenheft_IDbService_Interface.md (dieses Dokument) |
Setzt Nr. 1 voraus |
| 4 | Lastenheft_Statistik_View_Lesemethoden.md |
Setzt Nr. 1 voraus |
| 5 | Lastenheft_MongoDB_Paritaet.md |
Keine direkte, logisch nach Nr. 1 |
Nach Abschluss der PostgreSQL-Paritaet besitzen SqliteDbService und PgSqlDbService identische oeffentliche Methoden-Signaturen. Es fehlt jedoch ein formales Interface, das diese Parität abbildet. Aktuell referenziert der ServiceContainer beide Services als konkrete Typen. Ein Wechsel oder paralleler Betrieb erfordert manuelle Codeaenderungen an allen Aufrufstellen.
| Methode | Rueckgabe |
|---|---|
InitializeDatabase() |
void |
SaveOrUpdateMachineAsync(Machine, bool) |
Task<int> |
SaveHardwareInventoryAsync(int, HardwareInventory) |
Task |
SaveSoftwareInventoryAsync(int, SoftwareInventory) |
Task |
GetMachinesAsync() |
Task<List<Machine>> |
GetAllActiveMachinesAsync() |
Task<List<MachineState>> |
GetAllActiveMachinesWithNetworkInfoAsync() |
Task<List<MachineState>> |
GetAllDeprovisionedMachinesAsync() |
Task<List<MachineState>> |
GetAllDisabledMachinesAsync() |
Task<List<MachineState>> |
GetMachineByIdAsync(int) |
Task<Machine?> |
GetMachineByNameAsync(string) |
Task<Machine?> |
GetLatestHardwareInventoryAsync(int) |
Task<HardwareInventories?> |
GetLatestSoftwareInventoryAsync(int) |
Task<SoftwareInventories?> |
CleanupOldRecordsAsync(int) |
Task |
HasMachineRecordsAsync() |
Task<bool> |
HasHardwareInventoryRecordsAsync() |
Task<bool> |
HasSoftwareInventoryRecordsAsync() |
Task<bool> |
GetMachineCountAsync() |
Task<int> |
GetHardwareInventoryCountAsync() |
Task<int> |
GetSoftwareInventoryCountAsync() |
Task<int> |
InitializeMachinesFromCsvAsync(string) |
Task<int> |
Ein Interface IDbService wird unter InventarWorkerCommon/Services/Database/ erstellt. Es enthaelt alle oeffentlichen Methoden, die sowohl SqliteDbService als auch PgSqlDbService anbieten (siehe Tabelle oben).
SqliteDbServiceimplementiertIDbService.PgSqlDbServiceimplementiertIDbService.- Bestehende Funktionalitaet darf nicht veraendert werden.
ServiceContainer exponiert die Datenbank-Services ueber das Interface:
DbServicewird zuIDbService(Property-Typ-Aenderung).PgSqlDbServicewird zuIDbService?(nullable, da bei fehlendem Settings kein PgSQL-Service existiert).- Der Konstruktor akzeptiert
IDbServicestatt konkreter Typen.
Alle Stellen, die direkt SqliteDbService oder PgSqlDbService referenzieren, muessen auf IDbService umgestellt werden:
HarvesterWorkerService/Worker.csInventarWorkerCommon/Services/Common/Initialize.cs- Weitere Aufrufer, die bei der Implementierung identifiziert werden.
Das Interface IDbService muss vollstaendig mit XML-Kommentaren dokumentiert werden. Die Dokumentation der Methoden im Interface ist kanonisch; die implementierenden Klassen koennen via <inheritdoc/> darauf verweisen.
- Dependency-Injection-Registrierung (z.B. ueber
IServiceCollection). Die manuelle Instanziierung inInitialize.csbleibt erhalten. - Automatisches Provider-Switching ueber Konfiguration (z.B. via
appsettings.json). Der konkrete Provider wird weiterhin inInitialize.csgewaehlt. - Erweiterung des Interfaces um MongoDB-Methoden (MongoDB hat eine andere API-Oberflaeche).
| ID | Kriterium |
|---|---|
| AK-IDB-01 | IDbService existiert unter InventarWorkerCommon/Services/Database/ mit allen Methoden aus der Tabelle oben. |
| AK-IDB-02 | SqliteDbService und PgSqlDbService implementieren IDbService. |
| AK-IDB-03 | ServiceContainer nutzt IDbService als Property-Typen. |
| AK-IDB-04 | Kein Consumer referenziert mehr direkt SqliteDbService oder PgSqlDbService (Ausnahme: Initialize.cs bei der Instanziierung). |
| AK-IDB-05 | Alle bestehenden Tests kompilieren und laufen unveraendert gruen. |
| AK-IDB-06 | dotnet build laeuft ohne Warnungen (bezogen auf den neuen Code) durch. |
Deutsch: Dieses Feature zeigt das "Program to an interface, not an implementation"-Prinzip (SOLID: Dependency Inversion). Durch ein gemeinsames Interface koennen verschiedene Datenbank-Provider ausgetauscht werden, ohne dass die aufrufende Logik geaendert werden muss. In der Praxis ermoeglicht das z.B. SQLite fuer lokale Entwicklung und PostgreSQL fuer Produktion -- der Anwendungscode bleibt identisch.
English: This feature demonstrates the "Program to an interface, not an implementation" principle (SOLID: Dependency Inversion). A shared interface allows different database providers to be swapped without changing the calling logic. In practice, this enables e.g. SQLite for local development and PostgreSQL for production -- the application code remains identical.