Added some samples

This commit is contained in:
Sipke Schoorstra 2020-02-18 22:29:44 +01:00
parent 60bfb4e7b2
commit 299d465570
23 changed files with 280 additions and 11 deletions

View file

@ -88,6 +88,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Server.GraphQL", "src\
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.Serialization", "src\samples\Elsa.Samples.Serialization\Elsa.Samples.Serialization.csproj", "{DF47517F-9029-44DF-A29F-F2DE15041473}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.HelloWorldConsole", "src\samples\Elsa.Samples.HelloWorldConsole\Elsa.Samples.HelloWorldConsole.csproj", "{E224F8CF-F9F5-4E99-B405-758F3C02C47A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.HelloWorldHttp", "src\samples\Elsa.Samples.HelloWorldHttp\Elsa.Samples.HelloWorldHttp.csproj", "{A11D79AE-F4C9-4595-9B73-0E0AB221B90D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.CustomActivities", "src\samples\Elsa.Samples.CustomActivities\Elsa.Samples.CustomActivities.csproj", "{554C21D7-10BE-48E6-B0EF-9FCA43B32A0F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.TimeSheetApproval", "src\samples\Elsa.Samples.TimeSheetApproval\Elsa.Samples.TimeSheetApproval.csproj", "{1678743A-9095-4683-8DCD-5763F41924E2}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -198,6 +206,22 @@ Global
{DF47517F-9029-44DF-A29F-F2DE15041473}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DF47517F-9029-44DF-A29F-F2DE15041473}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DF47517F-9029-44DF-A29F-F2DE15041473}.Release|Any CPU.Build.0 = Release|Any CPU
{E224F8CF-F9F5-4E99-B405-758F3C02C47A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E224F8CF-F9F5-4E99-B405-758F3C02C47A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E224F8CF-F9F5-4E99-B405-758F3C02C47A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E224F8CF-F9F5-4E99-B405-758F3C02C47A}.Release|Any CPU.Build.0 = Release|Any CPU
{A11D79AE-F4C9-4595-9B73-0E0AB221B90D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A11D79AE-F4C9-4595-9B73-0E0AB221B90D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A11D79AE-F4C9-4595-9B73-0E0AB221B90D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A11D79AE-F4C9-4595-9B73-0E0AB221B90D}.Release|Any CPU.Build.0 = Release|Any CPU
{554C21D7-10BE-48E6-B0EF-9FCA43B32A0F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{554C21D7-10BE-48E6-B0EF-9FCA43B32A0F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{554C21D7-10BE-48E6-B0EF-9FCA43B32A0F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{554C21D7-10BE-48E6-B0EF-9FCA43B32A0F}.Release|Any CPU.Build.0 = Release|Any CPU
{1678743A-9095-4683-8DCD-5763F41924E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1678743A-9095-4683-8DCD-5763F41924E2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1678743A-9095-4683-8DCD-5763F41924E2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1678743A-9095-4683-8DCD-5763F41924E2}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -238,6 +262,10 @@ Global
{150EF356-E8BC-4922-91C2-362017479409} = {600C4AE0-0585-4181-9CEC-2BB43430C713}
{12D29DDC-A885-4CAA-908C-106D845B10C0} = {468E498C-59DB-4541-8D8A-0D89DE9083AB}
{DF47517F-9029-44DF-A29F-F2DE15041473} = {5E5E1E84-DDBC-40D6-B891-0D563A15A44A}
{E224F8CF-F9F5-4E99-B405-758F3C02C47A} = {5E5E1E84-DDBC-40D6-B891-0D563A15A44A}
{A11D79AE-F4C9-4595-9B73-0E0AB221B90D} = {5E5E1E84-DDBC-40D6-B891-0D563A15A44A}
{554C21D7-10BE-48E6-B0EF-9FCA43B32A0F} = {5E5E1E84-DDBC-40D6-B891-0D563A15A44A}
{1678743A-9095-4683-8DCD-5763F41924E2} = {5E5E1E84-DDBC-40D6-B891-0D563A15A44A}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {8B0975FD-7050-48B0-88C5-48C33378E158}

View file

@ -17,6 +17,5 @@
}
public object? Value { get; set; }
public string Test { get; set; } = "Test";
}
}

View file

@ -25,7 +25,9 @@ namespace Elsa.Results
protected override void Execute(ActivityExecutionContext activityExecutionContext)
{
activityExecutionContext.Output = Output;
if(Output != null)
activityExecutionContext.Output = Output;
activityExecutionContext.Outcomes = Outcomes.ToList();
var workflowExecutionContext = activityExecutionContext.WorkflowExecutionContext;

View file

@ -22,11 +22,11 @@ namespace Elsa.Expressions
public class CodeExpression<T> : CodeExpression, IWorkflowExpression<T>
{
public CodeExpression(Func<ActivityExecutionContext, T> expression) : base(context => expression(context))
public CodeExpression(Func<ActivityExecutionContext, T> expression) : base(context => expression != null ? expression(context) : default)
{
}
public CodeExpression(Func<T> expression) : base(context => expression())
public CodeExpression(Func<T> expression) : base(context => expression != null ? expression() : default)
{
}

View file

@ -48,6 +48,6 @@ namespace Elsa.Expressions
IWorkflowExpression<T> expression,
ActivityExecutionContext context,
CancellationToken cancellationToken = default)
=> (T)await EvaluateAsync((IWorkflowExpression)expression, typeof(T), context, cancellationToken);
=> (T)await EvaluateAsync(expression, typeof(T), context, cancellationToken);
}
}

View file

@ -116,8 +116,8 @@ namespace Microsoft.Extensions.DependencyInjection
.AddTransient<IActivityResolver, ActivityResolver>()
.AddTransient<IWorkflowProvider, StoreWorkflowProvider>()
.AddTransient<IWorkflowProvider, CodeWorkflowProvider>()
.AddTransient<WorkflowBuilder>()
.AddTransient<Func<WorkflowBuilder>>(sp => sp.GetRequiredService<WorkflowBuilder>)
.AddTransient<IWorkflowBuilder, WorkflowBuilder>()
.AddTransient<Func<IWorkflowBuilder>>(sp => sp.GetRequiredService<IWorkflowBuilder>)
.AddStartupTask<StartServiceBusTask>()
.AddConsumer<RunWorkflow, RunWorkflowHandler>()
.AddAutoMapperProfile<WorkflowDefinitionProfile>(ServiceLifetime.Singleton)

View file

@ -15,9 +15,9 @@ namespace Elsa.WorkflowProviders
public class CodeWorkflowProvider : IWorkflowProvider
{
private readonly IEnumerable<IWorkflow> workflows;
private readonly Func<WorkflowBuilder> workflowBuilder;
private readonly Func<IWorkflowBuilder> workflowBuilder;
public CodeWorkflowProvider(IEnumerable<IWorkflow> workflows, Func<WorkflowBuilder> workflowBuilder)
public CodeWorkflowProvider(IEnumerable<IWorkflow> workflows, Func<IWorkflowBuilder> workflowBuilder)
{
this.workflows = workflows;
this.workflowBuilder = workflowBuilder;

View file

@ -0,0 +1,28 @@
using System.Linq;
using System.Net;
using Elsa.Activities.Http;
using Elsa.Builders;
using Elsa.Services.Models;
using Microsoft.AspNetCore.Http;
namespace Elsa.Samples.CustomActivities
{
public class EchoQueryStringWorkflow : IWorkflow
{
public void Build(IWorkflowBuilder builder)
{
builder
.ReceiveHttpRequest("/hello")
.Then<ReadQueryString>()
.WriteHttpResponse(HttpStatusCode.OK, GenerateSomeHtml, "text/html");
}
private string GenerateSomeHtml(ActivityExecutionContext context)
{
var query = (IQueryCollection) context.Input.Value; // the output of the previous activity will be available as input to this one.
var items = query.Select(x => $"<li>{x.Key}: {x.Value}</li>");
return $"<ul>{string.Join("\n", items)}</ul>";
}
}
}

View file

@ -0,0 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\core\Elsa\Elsa.csproj" />
</ItemGroup>
</Project>

View file

@ -0,0 +1,14 @@
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
namespace Elsa.Samples.CustomActivities
{
public class Program
{
public static void Main(string[] args) => CreateHostBuilder(args).Build().Run();
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
}
}

View file

@ -0,0 +1,28 @@
using Elsa.Models;
using Elsa.Results;
using Elsa.Services;
using Elsa.Services.Models;
using Microsoft.AspNetCore.Http;
namespace Elsa.Samples.CustomActivities
{
/// <summary>
/// A basic activity that simply reads the query string and returns them as an output value for consumption by other activities.
/// </summary>
public class ReadQueryString : Activity
{
private readonly IHttpContextAccessor _httpContextAccessor;
public ReadQueryString(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
protected override IActivityExecutionResult OnExecute(ActivityExecutionContext context)
{
var query = _httpContextAccessor.HttpContext.Request.Query;
return Done(Variable.From(query));
}
}
}

View file

@ -0,0 +1,22 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
namespace Elsa.Samples.CustomActivities
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services
.AddElsa()
.AddHttp()
.AddActivity<ReadQueryString>()
.AddWorkflow<EchoQueryStringWorkflow>();
}
public void Configure(IApplicationBuilder app)
{
app.UseHttpActivities();
}
}
}

View file

@ -0,0 +1 @@
GET http://localhost:5000/hello?foo=bar&bar=baz

View file

@ -0,0 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\core\Elsa\Elsa.csproj" />
</ItemGroup>
</Project>

View file

@ -0,0 +1,36 @@
using System;
using System.Threading.Tasks;
using Elsa.Activities.Console;
using Elsa.Builders;
using Elsa.Services;
using Microsoft.Extensions.DependencyInjection;
namespace Elsa.Samples.HelloWorldConsole
{
class Program
{
static async Task Main(string[] args)
{
// Create a service container with Elsa services.
var services = new ServiceCollection()
.AddElsa()
.AddConsoleActivities()
.AddSingleton(Console.In)
.BuildServiceProvider();
// Build a new workflow.
var workflow = services.GetService<IWorkflowBuilder>()
.WriteLine("Hello World!")
.WriteLine("What's your name?")
.ReadLine()
.WriteLine(context => $"Greetings, {context.Input.Value}!")
.Build();
// Get the workflow host.
var workflowHost = services.GetService<IWorkflowHost>();
// Execute the workflow.
await workflowHost.RunWorkflowAsync(workflow);
}
}
}

View file

@ -0,0 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\core\Elsa\Elsa.csproj" />
</ItemGroup>
</Project>

View file

@ -0,0 +1,17 @@
using System.Net;
using Elsa.Activities.Http;
using Elsa.Activities.Primitives;
using Elsa.Builders;
namespace Elsa.Samples.HelloWorldHttp
{
public class HelloHttpWorkflow : IWorkflow
{
public void Build(IWorkflowBuilder builder)
{
builder
.ReceiveHttpRequest("/hello")
.WriteHttpResponse(HttpStatusCode.OK, "Hello World!");
}
}
}

View file

@ -0,0 +1,14 @@
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
namespace Elsa.Samples.HelloWorldHttp
{
public class Program
{
public static void Main(string[] args) => CreateHostBuilder(args).Build().Run();
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
}
}

View file

@ -0,0 +1,21 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
namespace Elsa.Samples.HelloWorldHttp
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services
.AddElsa()
.AddHttp()
.AddWorkflow<HelloHttpWorkflow>();
}
public void Configure(IApplicationBuilder app)
{
app.UseHttpActivities();
}
}
}

View file

@ -0,0 +1 @@
GET http://localhost:5000/hello

View file

@ -18,8 +18,10 @@ namespace Elsa.Samples.Serialization
.AddElsa()
.AddConsoleActivities()
.BuildServiceProvider();
var activityResolver = services.GetRequiredService<IActivityResolver>();
var writeLine = activityResolver.ResolveActivity<WriteLine>().WithText(new LiteralExpression<string>("Foo"));
var workflowDefinition = new WorkflowDefinitionVersion
{
Activities = new List<ActivityDefinition> { ActivityDefinition.FromActivity(writeLine) }
@ -30,8 +32,6 @@ namespace Elsa.Samples.Serialization
Console.WriteLine(json);
var workflowDefinition2 = serializer.Deserialize<WorkflowDefinitionVersion>(json, JsonTokenFormatter.FormatName);
}
}
}

View file

@ -0,0 +1,8 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
</Project>

View file

@ -0,0 +1,12 @@
using System;
namespace Elsa.Samples.TimeSheetApproval
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}