Loading Workflows from JSON
Loading workflows from JSON is a great way to store workflows in a database or file system. This guide will show you how to load workflows from JSON files.
Console application
The most straightforward way to load workflows from JSON files is to simply load the contents of a JSON file, deserialize it and then execute the deserialized workflow.
Generate a new Console application using the following command:
dotnet new console -n "ElsaConsole" -f net8.0 cd ElsaConsole dotnet add package Elsa dotnet add package Elsa.Testing.SharedHere's a complete Program.cs file that demonstrates how to load a workflow from a JSON file and execute it:
Program.cs
using Elsa.Extensions; using Elsa.Testing.Shared; using Elsa.Workflows.Contracts; using Elsa.Workflows.Management.Mappers; using Elsa.Workflows.Management.Models; using Microsoft.Extensions.DependencyInjection; // Setup service container. var services = new ServiceCollection(); // Add Elsa services. services.AddElsa(); // Build service container. var serviceProvider = services.BuildServiceProvider(); // Populate registries. This is only necessary for applications that are not using hosted services. await serviceProvider.PopulateRegistriesAsync(); // Import a workflow from a JSON file. var workflowJson = await File.ReadAllTextAsync("HelloWorld.json"); // Get a serializer to deserialize the workflow. var serializer = serviceProvider.GetRequiredService<IActivitySerializer>(); // Deserialize the workflow model. var workflowDefinitionModel = serializer.Deserialize<WorkflowDefinitionModel>(workflowJson); // Map the model to a Workflow object. var workflowDefinitionMapper = serviceProvider.GetRequiredService<WorkflowDefinitionMapper>(); var workflow = workflowDefinitionMapper.Map(workflowDefinitionModel); // Resolve a workflow runner to run the workflow. var workflowRunner = serviceProvider.GetRequiredService<IWorkflowRunner>(); // Run the workflow. await workflowRunner.RunAsync(workflow);Create a new file called HelloWorld.json in the root of the project and make sure it is configured to be copied to the output directory. HelloWorld.json
{ "id": "HelloWorld-v1", "definitionId": "HelloWorld", "name": "Hello World", "isLatest": true, "isPublished": true, "root": { "id": "Flowchart1", "type": "Elsa.Flowchart", "activities": [ { "id": "WriteLine1", "type": "Elsa.WriteLine", "text": { "typeName": "String", "expression": { "type": "Literal", "value": "Hello World!" } } } ] } }Run the program using the following command:
dotnet run
The console should output the following:
Elsa Server
When you're hosting an Elsa Server, providing workflows from JSON files is even easier.
All you need to do then is create a folder called Workflows and add any number of workflow JSON files to it.
Let's try it out:
Setup an Elsa Server project.
Create a new folder called Workflows
Create a new file called HelloWorld.json in the root of the project and make sure it is configured to be copied to the output directory. HelloWorld.json
{ "id": "HelloWorld-v1", "definitionId": "HelloWorld", "name": "Hello World", "isLatest": true, "isPublished": true, "root": { "id": "Flowchart1", "type": "Elsa.Flowchart", "activities": [ { "id": "WriteLine1", "type": "Elsa.WriteLine", "text": { "typeName": "String", "expression": { "type": "Literal", "value": "Hello World!" } } } ] } }Run the application using the following command:
dotnet run --urls "https://localhost:5001"Execute the workflow using the following curl:
curl --location --request POST 'https://localhost:5001/elsa/api/workflow-definitions/HelloWorld/execute' \ --header 'Authorization: ApiKey {your-api-key}'Alternatively, start ab Elsa Studio container and run the workflow from there
Summary
In this guide, we have seen how to load a JSON file and deserialize it into a Workflow
class and then execute it.
We have also seen how to configure an Elsa Server to serve workflows stored in JSON files.