Skip to Content
Client LibrariesDotnetGetting Started

Getting Started

Der .NET Client bietet eine vollständig typisierte, asynchrone API zur Interaktion mit der Engine. Der Client unterstützt .NET 6.0 und höher.

Installation

Via NuGet Package Manager

dotnet add package ProcessCube.Engine.Client

Via Package Manager Console

Install-Package ProcessCube.Engine.Client

Via .csproj

<PackageReference Include="ProcessCube.Engine.Client" Version="*" />

Der Client ist kompatibel mit .NET 6.0, .NET 7.0, .NET 8.0 und höher.

Grundlegende Verwendung

Client erstellen

using ProcessCube.Engine; // Engine-Adresse var engineAddress = "http://localhost:8000"; // Verschiedene spezialisierte Clients erstellen var appInfoClient = ClientFactory.CreateApplicationInfoClient(engineAddress); var processClient = ClientFactory.CreateProcessDefinitionsClient(engineAddress); var userTaskClient = ClientFactory.CreateUserTaskClient(engineAddress);

Erstes Beispiel

using ProcessCube.Engine; var engineAddress = "http://localhost:8000"; var client = ClientFactory.CreateApplicationInfoClient(engineAddress); // Engine-Informationen abrufen var info = await client.GetApplicationInfoAsync(); Console.WriteLine($"Process Engine: {info.Name} @ {info.Version}");

Client-Typen

Der .NET Client stellt spezialisierte Clients für verschiedene Funktionsbereiche bereit:

ApplicationInfoClient

var client = ClientFactory.CreateApplicationInfoClient(engineAddress); var info = await client.GetApplicationInfoAsync(); var authorityAddress = await client.GetAuthorityAddressAsync();

ProcessDefinitionsClient

var client = ClientFactory.CreateProcessDefinitionsClient(engineAddress); // Prozesse auflisten var processes = await client.GetProcessModelsAsync(); // Prozess starten var response = await client.StartProcessInstanceAsync( processModelId: "OrderProcess", startEventId: "StartEvent1", initialToken: new { orderId = "12345" } );

UserTaskClient

var client = ClientFactory.CreateUserTaskClient(engineAddress); // User Tasks abfragen var userTasks = await client.QueryAsync(query => { query.FilterByState(UserTaskState.Suspended); }); // User Task abschließen await client.FinishUserTaskAsync(userTask, result);

ExternalTaskClient

var client = ClientFactory.CreateExternalTaskClient(engineAddress); // External Tasks abrufen var tasks = await client.FetchAndLockAsync( topic: "ProcessPayment", maxTasks: 10, lockDuration: TimeSpan.FromSeconds(60) );

Mit Authentifizierung

Wenn die Engine mit Authority abgesichert ist:

using ProcessCube.Engine; using ProcessCube.Engine.Client.Identity; // OAuth 2.0 Credentials var authorityAddress = "http://localhost:11235"; var clientId = "my-service"; var clientSecret = "secret-key"; // Identity Provider erstellen var identityProvider = new ClientCredentialsIdentityProvider( authorityAddress: authorityAddress, clientId: clientId, clientSecret: clientSecret, scope: "engine_read engine_write" ); // Authentifizierung durchführen var identity = await identityProvider.GetIdentityAsync(); // Client mit Identity erstellen var client = ClientFactory.CreateProcessDefinitionsClient( engineAddress: "http://localhost:8000", identity: identity ); // Jetzt authentifizierte Requests ausführen var processes = await client.GetProcessModelsAsync();

Tokens haben eine begrenzte Lebenszeit. Für lang laufende Anwendungen sollte die periodische Token-Erneuerung verwendet werden.

Periodische Token-Erneuerung

using ProcessCube.Engine.Client.Identity; var identityProvider = new ClientCredentialsIdentityProvider( authorityAddress: "http://localhost:11235", clientId: "my-service", clientSecret: "secret-key", scope: "engine_read engine_write" ); // Periodische Provisionierung starten var identityHolder = await identityProvider.StartPeriodicProvisioningAsync(); // Client mit IdentityHolder erstellen var client = ClientFactory.CreateProcessDefinitionsClient( engineAddress: "http://localhost:8000", identityHolder: identityHolder ); // Token wird automatisch vor Ablauf erneuert var processes = await client.GetProcessModelsAsync(); // Provisionierung stoppen wenn nicht mehr benötigt await identityHolder.StopPeriodicProvisioningAsync();

Async/Await Pattern

Alle Client-Methoden sind asynchron und verwenden das Async/Await-Pattern:

// ✅ Empfohlen - Async/Await verwenden var processes = await client.GetProcessModelsAsync(); // ❌ Nicht empfohlen - Blockierender Call var processes = client.GetProcessModelsAsync().Result;

Dependency Injection (ASP.NET Core)

Integration in ASP.NET Core mit Dependency Injection:

// Startup.cs oder Program.cs public void ConfigureServices(IServiceCollection services) { // Engine-Adresse konfigurieren var engineAddress = Configuration["ProcessCube:EngineAddress"]; // Clients registrieren services.AddSingleton(sp => ClientFactory.CreateProcessDefinitionsClient(engineAddress) ); services.AddSingleton(sp => ClientFactory.CreateUserTaskClient(engineAddress) ); } // Controller oder Service public class OrderController : ControllerBase { private readonly IProcessDefinitionsClient _processClient; public OrderController(IProcessDefinitionsClient processClient) { _processClient = processClient; } [HttpPost("orders")] public async Task<IActionResult> CreateOrder(OrderDto order) { var response = await _processClient.StartProcessInstanceAsync( processModelId: "OrderProcess", startEventId: "StartEvent1", initialToken: order ); return Ok(new { processInstanceId = response.ProcessInstanceId }); } }

Records für Payloads

Verwenden Sie C# Records für typisierte Payloads:

// Payload als Record definieren internal sealed record OrderPayload( string OrderId, string CustomerName, decimal Amount ); // Prozess mit typisiertem Payload starten var payload = new OrderPayload( OrderId: "ORD-12345", CustomerName: "Max Mustermann", Amount: 1500.00m ); var response = await client.StartProcessInstanceAsync( processModelId: "OrderProcess", startEventId: "StartEvent1", initialToken: payload );

Fehlerbehandlung

using ProcessCube.Engine.Client.Exceptions; try { var response = await client.StartProcessInstanceAsync( processModelId: "OrderProcess", startEventId: "StartEvent1", initialToken: payload ); Console.WriteLine($"Prozess gestartet: {response.ProcessInstanceId}"); } catch (EngineClientException ex) { // Engine-spezifische Fehler Console.WriteLine($"Engine-Fehler: {ex.Message}"); } catch (HttpRequestException ex) { // Netzwerk-Fehler Console.WriteLine($"Verbindungsfehler: {ex.Message}"); } catch (Exception ex) { // Allgemeine Fehler Console.WriteLine($"Fehler: {ex.Message}"); }

Logging

Integration mit Microsoft.Extensions.Logging:

using Microsoft.Extensions.Logging; var loggerFactory = LoggerFactory.Create(builder => { builder .AddConsole() .SetMinimumLevel(LogLevel.Debug); }); // Logger an ClientFactory übergeben ClientFactory.ConfigureLogging(loggerFactory); var client = ClientFactory.CreateProcessDefinitionsClient(engineAddress);

Nächste Schritte

Tipp: Der .NET Client bietet vollständige IntelliSense-Unterstützung und Type Safety für alle API-Operationen.