# Abhängigkeiten

> Projekt-Abhängigkeiten, Azure-Dienste, externe Systeme und architekturkritische Kopplungen.

---

Site [llms.txt](/llms.txt)

---

## Plattform

- `net10.0` in allen Projekten, `ImplicitUsings` und `Nullable` aktiv.
- Azure Functions v4, Isolated Worker, `OutputType=Exe`.
- Tests auf xUnit v3 mit Microsoft Testing Platform. Aufruf mit
  `dotnet test --project …`; das Positionsargument funktioniert nicht mehr.

## Projekte

```mermaid
flowchart LR
    HOST["DataBridge (Host)"] --> CORE["DataBridge.Core"]
    DLM["DeadLetterMover"] --> CORE
    TEST["DataBridge.Test"] --> CORE
    TEST --> HOST
```

## NuGet-Pakete

Die Versionen werden zentral in `src/Directory.Packages.props` gepflegt (Central Package
Management); die `.csproj`-Dateien referenzieren Pakete nur noch ohne `Version`. Ein Update
passiert also an genau einer Stelle.

**Sicherheitsprüfung beim Build:** `Directory.Packages.props` aktiviert NuGet Audit für alle
Projekte, inklusive transitiver Pakete, und meldet Treffer jeder Schwere. Ab „moderate“
(`NU1902`–`NU1904`) gelten sie als Fehler, „low“ (`NU1901`) bleibt eine Warnung — solche Lücken
betreffen oft Funktionen, die gar nicht genutzt werden, und sollen kein Release blockieren.
Ein Paket mit einer Sicherheitslücke ab „moderate“ lässt damit Restore und Build lokal, im
Dockerfile und in der Pipeline scheitern. Abhilfe ist ein Update der betroffenen Version; liegt
die Lücke in einem transitiven Paket, dieses mit eigener Version in `Directory.Packages.props`
aufnehmen. Weil neue Advisories jederzeit erscheinen, kann ein bisher grüner Stand ohne
Code-Änderung rot werden. Ist der Advisory-Feed nicht erreichbar, bleibt es bei der Warnung
`NU1900`, offline bauen funktioniert also weiter.

Hier nur die Rolle der wichtigsten Pakete:

| Paket | Projekt | Rolle |
|---|---|---|
| `Microsoft.Azure.Functions.Worker.*` | Host | Runtime, HTTP/ASP.NET-Core-, Service-Bus-, Timer-, Storage-, Durable-Extensions |
| `Microsoft.ApplicationInsights.WorkerService`, `Microsoft.ApplicationInsights` | Host, Core | Telemetrie. **Pin auf 2.23.0**, weil 3.x `ITelemetryProcessor` entfernt hat |
| `ModelContextProtocol.AspNetCore` | Host | MCP-Server |
| `ModelContextProtocol.Core` | Core | nur `McpException`, damit Tool-Fehlerursachen den MCP-Client erreichen |
| `Azure.Data.Tables` | Core | Table Storage |
| `Azure.Messaging.ServiceBus` | Core | Queues, Queue-Laufzeitdaten |
| `Azure.Identity`, `Azure.Security.KeyVault.Secrets` | Core | `DefaultAzureCredential`, optionaler Key-Vault-Bezug |
| `Microsoft.PowerPlatform.Dataverse.Client` | Core | CE-Connector |
| `Microsoft.PowerPlatform.Dataverse.Client.AzAuth` | Core | CE-Connector, Managed Identity |
| `Microsoft.OData.Edm`, `Microsoft.OData.Core` | Core, Host | EDM-Metadaten für BC/NAV |
| `Microsoft.OpenApi`, `Microsoft.OpenApi.YamlReader` | Core | OpenAPI-Connector |
| `Microsoft.Data.SqlClient`, `Npgsql`, `MySql.Data`, `Oracle.ManagedDataAccess.Core` | Core | SQL-Connectoren |
| `NCrontab.Signed` | Core | Cron-Auswertung mit Sekundenfeld |
| `Newtonsoft.Json` | alle | Serialisierung von `QueueMessage` und Konfigurations-JSON |
| `System.Linq.Async` | Core | `IAsyncEnumerable` beim seitenweisen Abruf |

Alle DB-Treiber werden immer mitgeladen, auch wenn nur ein Teil genutzt wird.

## Azure-Dienste

| Dienst | Verwendung | Kritikalität |
|---|---|---|
| Azure Functions / App Service Plan | Ausführung | kritisch |
| Azure Service Bus (Basic) | Messaging zwischen Erkennung und Verarbeitung | kritisch |
| Azure Table Storage | Konfiguration und Watermarks | kritisch |
| Azure Blob/File/Queue Storage | Functions-Runtime, Content Share, Durable-State | kritisch |
| Application Insights | Telemetrie | hoch |
| Grafana-Dashboard (Azure Managed) | Betriebsdashboard | optional |
| Azure Key Vault | optionaler Secret-Bezug der Connectoren, nicht deployt | optional |

## Externe Systeme

| System | Protokoll / SDK | Lesen | Schreiben |
|---|---|---|---|
| D365 Business Central | OData v4, OAuth2 / Basic / Managed Identity | ja | ja |
| D365 CE / Dataverse | `ServiceClient` (Connection-String oder Managed Identity über `AzAuth`), Change Tracking | ja | ja |
| D365 NAV | OData, OAuth2 / Basic | ja | ja |
| REST-API mit OpenAPI-Spezifikation | HTTP, API-Key / OAuth2 / Basic | ja | ja |
| MSSQL, PostgreSQL, MySQL, Oracle | ADO.NET | ja | nein |

## Architekturkritische Kopplungen

| Abhängigkeit | Risiko |
|---|---|
| Service Bus Basic | Keine Topics, Sessions, Partitionierung, Duplicate Detection |
| Table Storage als Konfig-Store | Fehlkonfiguration wirkt global; Prüfung nur über `CheckListService` und `JobService.Initialize` |
| Dataverse-SDK-Version | Enge Kopplung des CE-Connectors |
| `NCrontab.Signed` | Bestimmt die Scheduling-Semantik |
| Eigener `BufferingLoggerProvider` | Diagnose hängt am Custom-Sampling; AI-Standardprovider ist abgeschaltet |
| `Newtonsoft.Json` | Verbindliches Wire-Format der Nachrichten |
| String-Typisierung der Nachrichten | Jeder Resolver parst selbst inkl. Locale; Quelle von Kulturproblemen zwischen Systemen |
