Skip to Content
DocsClientsDotnetGetting Started

Getting Started

Der ProcessCube® .NET Client bietet eine vollständig typisierte, asynchrone API zur Interaktion mit der ProcessCube® 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.