Dependency Injection
Die Runtime stellt Konstruktorabhängigkeiten wie Sitzung, Ausführungskontext und Logger bereit:
public sealed class LagerModule(
IBpSession session,
AutomationContext context,
ILogger<LagerModule> logger) : BpModule
{
public override string ModuleName => "Lager Basic";
// Weitere Modulmitglieder sind hier ausgelassen.
}
Auch Seiten (BpPage), Controller ([ActionController]) und eigene Dienste können ihre
Abhängigkeiten über den Konstruktor anfordern.
Integrierte Dienste
Diese Dienste stehen ohne eigene Registrierung bereit:
| Dienst | Inhalt |
|---|---|
IBpSession |
microtech-ERP-Verbindung über die klassische COM-Schnittstelle, bereits angemeldet |
IBpQlSession |
microtech-ERP-Verbindung über GraphQL, bereits angemeldet |
ILogger<T> |
Protokollierung, sichtbar im Detail der Ausführung |
AutomationContext |
Daten der laufenden Ausführung: RunId, Modul, Auslöser |
IModuleConfig |
gespeicherte Einstellungen des Moduls lesen |
ISecrets |
verschlüsselt abgelegte Geheimnisse lesen, etwa Tokens und Passwörter |
INotifications |
Benachrichtigungen an die Administratoren |
IWebhooks |
Ereignisse an abonnierte Ziele senden (siehe Webhooks) |
IBpSessions |
leiht einzelne microtech-ERP-Sitzungen, für lang laufende Services (siehe Services) |
Abfragen und Schreiboperationen sind unter SDK-Datenzugriff in Modulen beschrieben.
Eigene Abhängigkeiten registrieren
Registrieren Sie eigene Abhängigkeiten in einer öffentlichen statischen Methode
ConfigureServices der Modulklasse. Für IHttpClientFactory genügt AddHttpClient:
public sealed class FremdwaehrungKurseModule(IHttpClientFactory httpClientFactory) : BpModule
{
public override string ModuleName => "Fremdwährungskurse";
public static void ConfigureServices(IServiceCollection services) => services.AddHttpClient();
}
Eigene Klassen registrieren
Eigene Dienste registrieren Sie beispielsweise mit AddScoped:
public sealed class ArtikelAbfragen
{
public int Zaehlen(IBpSession session) => session.QueryDataSet<Artikel>().Count();
}
public sealed class MainModule(IBpSession session, ArtikelAbfragen artikel) : BpModule
{
public override string ModuleName => "Mein Modul";
public override string ModuleVersion => "1.0.0";
public static void ConfigureServices(IServiceCollection services)
{
services.AddScoped<ArtikelAbfragen>();
}
[Action("artikel-zaehlen", Display = "Artikel zählen")]
public int ArtikelZaehlen() => artikel.Zaehlen(session);
}
Fordern Sie die Sitzung auch bei ausgelagerter Abfragelogik im Modulkonstruktor an:
IBpSession für COM, IBpQlSession für GraphQL.
Beispiel: eigene Datenbank mit EF Core
Einen EF-Core-Kontext registrieren Sie mit AddDbContext, hier mit dem SQLite-Provider
aus Microsoft.EntityFrameworkCore.Sqlite:
public sealed class AdressenExportModule(
IBpQlSession session,
ExportDbContext db) : BpModule
{
public static void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ExportDbContext>(options =>
options.UseSqlite($"Data Source={Path.Combine(AppContext.BaseDirectory, "exports", "adressen.db")}"));
}
[Action("export-changed", Display = "Geänderte Adressen exportieren")]
[OnChanged]
public async Task<int> ExportChangedAsync(ChangedSet<Addresses> changes, CancellationToken cancellationToken)
{
Directory.CreateDirectory(Path.Combine(AppContext.BaseDirectory, "exports"));
await db.Database.EnsureCreatedAsync(cancellationToken).ConfigureAwait(false);
...
}
}
AddDbContext stellt pro Ausführung einen Kontext bereit.
Geeignete Lebensdauer wählen
Verwenden Sie AddScoped für Dienste mit Datenzugriff oder Bezug zur aktuellen Ausführung,
etwa einen Datenbankkontext. Sie erhalten pro Ausführung eine eigene Instanz.
AddTransient erzeugt bei jeder Anforderung eine neue Instanz. AddSingleton eignet sich
für gemeinsam genutzte, threadsichere Hilfsdienste ohne Sitzungs- oder Ausführungsbezug.