Table of Contents

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.