Incremental work on serialization of workflow definitions and instances

This commit is contained in:
Sipke Schoorstra 2020-04-19 12:26:36 +02:00
parent 1dd8db0c37
commit e8b59aeb84
57 changed files with 318 additions and 286 deletions

View file

@ -50,10 +50,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Scripting.JavaScript",
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Scripting.Liquid", "src\scripting\Elsa.Scripting.Liquid\Elsa.Scripting.Liquid.csproj", "{01DC21DD-C6E2-4B21-864E-97D29448F777}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "utils", "utils", "{0D276728-DDA8-46A0-91A9-D44401D66DA9}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.AutoMapper.Extensions", "src\utils\Elsa.AutoMapper.Extensions\Elsa.AutoMapper.Extensions.csproj", "{102626A4-8BA6-45A8-A69C-F5EB1F155BE7}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Activities.Reflection", "src\activities\Elsa.Activities.Reflection\Elsa.Activities.Reflection.csproj", "{258F624E-98D7-4498-AE2E-F612D8ECA763}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "server", "server", "{468E498C-59DB-4541-8D8A-0D89DE9083AB}"
@ -79,7 +75,6 @@ EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Persistence.MongoDb", "src\providers\Elsa.Persistence.MongoDb\Elsa.Persistence.MongoDb.csproj", "{36A6F881-1B40-438D-9B6D-80F01CE76D51}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Persistence.YesSql", "src\providers\Elsa.Persistence.YesSql\Elsa.Persistence.YesSql.csproj", "{DA825F41-EE97-47B3-801E-C694A6C53AEC}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample18", "src\samples\Sample18\Sample18.csproj", "{616AA0BA-FBDD-4ABE-B688-A3F79F38C698}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.Timers", "src\samples\Elsa.Samples.Timers\Elsa.Samples.Timers.csproj", "{071DD6EC-D00C-4513-82B6-3FE8438061E3}"
EndProject
@ -151,14 +146,6 @@ Global
{01DC21DD-C6E2-4B21-864E-97D29448F777}.Debug|Any CPU.Build.0 = Debug|Any CPU
{01DC21DD-C6E2-4B21-864E-97D29448F777}.Release|Any CPU.ActiveCfg = Release|Any CPU
{01DC21DD-C6E2-4B21-864E-97D29448F777}.Release|Any CPU.Build.0 = Release|Any CPU
{102626A4-8BA6-45A8-A69C-F5EB1F155BE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{102626A4-8BA6-45A8-A69C-F5EB1F155BE7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{102626A4-8BA6-45A8-A69C-F5EB1F155BE7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{102626A4-8BA6-45A8-A69C-F5EB1F155BE7}.Release|Any CPU.Build.0 = Release|Any CPU
{616AA0BA-FBDD-4ABE-B688-A3F79F38C698}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{616AA0BA-FBDD-4ABE-B688-A3F79F38C698}.Debug|Any CPU.Build.0 = Debug|Any CPU
{616AA0BA-FBDD-4ABE-B688-A3F79F38C698}.Release|Any CPU.ActiveCfg = Release|Any CPU
{616AA0BA-FBDD-4ABE-B688-A3F79F38C698}.Release|Any CPU.Build.0 = Release|Any CPU
{2AEA0028-96D6-4823-A88F-24294E4BA4E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2AEA0028-96D6-4823-A88F-24294E4BA4E8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2AEA0028-96D6-4823-A88F-24294E4BA4E8}.Release|Any CPU.ActiveCfg = Release|Any CPU
@ -253,9 +240,6 @@ Global
{6BB5EB72-AD9A-41ED-A6AA-0FF1093EA41B} = {35F44BE9-13D0-417C-A01A-F0787BEE6DC3}
{18BE8F72-E528-4617-B1B1-07BD35337DFC} = {9C3C685E-3D7D-4638-A031-24F71CF74B52}
{01DC21DD-C6E2-4B21-864E-97D29448F777} = {9C3C685E-3D7D-4638-A031-24F71CF74B52}
{0D276728-DDA8-46A0-91A9-D44401D66DA9} = {DA71CDAA-8DD3-4D5F-9FBD-8E4B37A2D925}
{102626A4-8BA6-45A8-A69C-F5EB1F155BE7} = {0D276728-DDA8-46A0-91A9-D44401D66DA9}
{616AA0BA-FBDD-4ABE-B688-A3F79F38C698} = {5E5E1E84-DDBC-40D6-B891-0D563A15A44A}
{2AEA0028-96D6-4823-A88F-24294E4BA4E8} = {5E5E1E84-DDBC-40D6-B891-0D563A15A44A}
{258F624E-98D7-4498-AE2E-F612D8ECA763} = {B43B546E-23F3-46E8-ACB7-D04F05CDA180}
{468E498C-59DB-4541-8D8A-0D89DE9083AB} = {DA71CDAA-8DD3-4D5F-9FBD-8E4B37A2D925}

View file

@ -1,19 +0,0 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/WRAP_LINES/@EntryValue">False</s:Boolean>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=EF/@EntryIndexedValue">EF</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=QL/@EntryIndexedValue">QL</s:String>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpKeepExistingMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpPlaceEmbeddedOnSameLineMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpUseContinuousIndentInsideBracesMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateBlankLinesAroundFieldToBlankLinesAroundProperty/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Autofixture/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Comparers/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Configurer/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Jint/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Mediat/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=mediatr/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=persistable/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Timesheet/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Workflows/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=workflow_0027s/@EntryIndexedValue">True</s:Boolean>
</wpf:ResourceDictionary>

View file

@ -5,6 +5,6 @@ namespace Elsa.Activities.Console
{
public static class ReadLineBuilderExtensions
{
public static ActivityBuilder ReadLine(this IBuilder builder) => builder.Then<ReadLine>();
public static IActivityBuilder ReadLine(this IBuilder builder) => builder.Then<ReadLine>();
}
}

View file

@ -8,11 +8,11 @@ namespace Elsa.Activities.Console
{
public static class WriteLineBuilderExtensions
{
public static OutcomeBuilder WriteLine(this IBuilder builder, Action<WriteLine> setup) => WriteLine(builder.Then(setup));
public static OutcomeBuilder WriteLine(this IBuilder builder, IWorkflowExpression<string> text) => builder.WriteLine(a => a.WithText(text));
public static OutcomeBuilder WriteLine(this IBuilder builder, Func<ActivityExecutionContext, string> text) => builder.WriteLine(new CodeExpression<string>(text));
public static OutcomeBuilder WriteLine(this IBuilder builder, Func<string> text) => builder.WriteLine(new CodeExpression<string>(text));
public static OutcomeBuilder WriteLine(this IBuilder builder, string text) => builder.WriteLine(new CodeExpression<string>(text));
private static OutcomeBuilder WriteLine(ActivityBuilder writeLine) => writeLine.When(OutcomeNames.Done);
public static IOutcomeBuilder WriteLine(this IBuilder builder, Action<WriteLine> setup) => WriteLine(builder.Then(setup));
public static IOutcomeBuilder WriteLine(this IBuilder builder, IWorkflowExpression<string> text) => builder.WriteLine(a => a.WithText(text));
public static IOutcomeBuilder WriteLine(this IBuilder builder, Func<ActivityExecutionContext, string> text) => builder.WriteLine(new CodeExpression<string>(text));
public static IOutcomeBuilder WriteLine(this IBuilder builder, Func<string> text) => builder.WriteLine(new CodeExpression<string>(text));
public static IOutcomeBuilder WriteLine(this IBuilder builder, string text) => builder.WriteLine(new CodeExpression<string>(text));
private static IOutcomeBuilder WriteLine(IActivityBuilder writeLine) => writeLine.When(OutcomeNames.Done);
}
}

View file

@ -9,12 +9,12 @@ namespace Elsa.Activities.Http
{
public static class SendEmailBuilderExtensions
{
public static ActivityBuilder SendEmail(
public static IActivityBuilder SendEmail(
this IBuilder builder,
Action<SendEmail> setup
) => builder.Then(setup);
public static ActivityBuilder SendEmail(
public static IActivityBuilder SendEmail(
this IBuilder builder,
IWorkflowExpression<string> from = default,
IWorkflowExpression<string> to = default,
@ -26,7 +26,7 @@ namespace Elsa.Activities.Http
.WithSubject(subject)
.WithBody(body));
public static ActivityBuilder SendEmail(
public static IActivityBuilder SendEmail(
this IBuilder builder,
Func<ActivityExecutionContext, string> from = default,
Func<ActivityExecutionContext, string> to = default,
@ -38,7 +38,7 @@ namespace Elsa.Activities.Http
.WithSubject(subject)
.WithBody(body));
public static ActivityBuilder SendEmail(
public static IActivityBuilder SendEmail(
this IBuilder builder,
Func<string> from = default,
Func<string> to = default,
@ -50,7 +50,7 @@ namespace Elsa.Activities.Http
.WithSubject(subject)
.WithBody(body));
public static ActivityBuilder SendEmail(
public static IActivityBuilder SendEmail(
this IBuilder builder,
string from = default,
string to = default,

View file

@ -6,7 +6,7 @@ namespace Elsa.Activities.Http
{
public static class ReceiveHttpRequestBuilderExtensions
{
public static ActivityBuilder ReceiveHttpRequest(
public static IActivityBuilder ReceiveHttpRequest(
this IBuilder builder,
PathString path,
string method = default,

View file

@ -1,3 +1,4 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using Elsa.Activities.Http.Results;
@ -31,9 +32,9 @@ namespace Elsa.Activities.Http
private IStringLocalizer<Redirect> T { get; }
[ActivityProperty(Hint = "The URL to redirect to (HTTP 302).")]
public IWorkflowExpression<PathString> Location
public IWorkflowExpression<Uri> Location
{
get => GetState<IWorkflowExpression<PathString>>();
get => GetState<IWorkflowExpression<Uri>>();
set => SetState(value);
}

View file

@ -1,3 +1,4 @@
using System;
using Elsa.Builders;
using Microsoft.AspNetCore.Http;
@ -6,9 +7,9 @@ namespace Elsa.Activities.Http
{
public static class RedirectBuilderExtensions
{
public static ActivityBuilder Redirect(
public static IActivityBuilder Redirect(
this IBuilder builder,
PathString location,
Uri location,
bool permanent = default) => builder.Then<Redirect>(x => x
.WithLocation(location)
.WithPermanent(permanent));

View file

@ -9,10 +9,10 @@ namespace Elsa.Activities.Http
{
public static class RedirectExtensions
{
public static Redirect WithLocation(this Redirect activity, IWorkflowExpression<PathString> value) => activity.With(x => x.Location, value);
public static Redirect WithLocation(this Redirect activity, Func<ActivityExecutionContext, PathString> value) => activity.With(x => x.Location, new CodeExpression<PathString>(value));
public static Redirect WithLocation(this Redirect activity, Func<PathString> value) => activity.With(x => x.Location, new CodeExpression<PathString>(value));
public static Redirect WithLocation(this Redirect activity, PathString value) => activity.With(x => x.Location, new CodeExpression<PathString>(value));
public static Redirect WithLocation(this Redirect activity, IWorkflowExpression<Uri> value) => activity.With(x => x.Location, value);
public static Redirect WithLocation(this Redirect activity, Func<ActivityExecutionContext, Uri> value) => activity.With(x => x.Location, new CodeExpression<Uri>(value));
public static Redirect WithLocation(this Redirect activity, Func<Uri> value) => activity.With(x => x.Location, new CodeExpression<Uri>(value));
public static Redirect WithLocation(this Redirect activity, Uri value) => activity.With(x => x.Location, new CodeExpression<Uri>(value));
public static Redirect WithPermanent(this Redirect activity, bool value) => activity.With(x => x.Permanent, value);
}
}

View file

@ -11,7 +11,7 @@ namespace Elsa.Activities.Http
{
public static class SendHttpRequestBuilderExtensions
{
public static ActivityBuilder SendHttpRequest(
public static IActivityBuilder SendHttpRequest(
this IBuilder builder,
PathString url,
string? method,
@ -31,7 +31,7 @@ namespace Elsa.Activities.Http
.WithRequestHeaders(headers)
.WithReadContent(readContent));
public static ActivityBuilder SendHttpRequest(
public static IActivityBuilder SendHttpRequest(
this IBuilder builder,
PathString url,
string? method,
@ -51,7 +51,7 @@ namespace Elsa.Activities.Http
.WithRequestHeaders(headers)
.WithReadContent(readContent));
public static ActivityBuilder SendHttpRequest(
public static IActivityBuilder SendHttpRequest(
this IBuilder builder,
PathString url,
string? method,
@ -71,7 +71,7 @@ namespace Elsa.Activities.Http
.WithRequestHeaders(headers)
.WithReadContent(readContent));
public static ActivityBuilder SendHttpRequest(
public static IActivityBuilder SendHttpRequest(
this IBuilder builder,
PathString url,
string? method,

View file

@ -10,7 +10,7 @@ namespace Elsa.Activities.Http
{
public static class WriteHttpResponseBuilderExtensions
{
public static ActivityBuilder WriteHttpResponse(
public static IActivityBuilder WriteHttpResponse(
this IBuilder builder,
HttpStatusCode statusCode,
IWorkflowExpression<string> content = default,
@ -22,7 +22,7 @@ namespace Elsa.Activities.Http
.WithContentType(contentType)
.WithResponseHeaders(headers));
public static ActivityBuilder WriteHttpResponse(
public static IActivityBuilder WriteHttpResponse(
this IBuilder builder,
HttpStatusCode statusCode,
Func<ActivityExecutionContext, string> content = default,
@ -34,7 +34,7 @@ namespace Elsa.Activities.Http
.WithContentType(contentType)
.WithResponseHeaders(headers));
public static ActivityBuilder WriteHttpResponse(
public static IActivityBuilder WriteHttpResponse(
this IBuilder builder,
HttpStatusCode statusCode,
Func<string> content = default,
@ -46,7 +46,7 @@ namespace Elsa.Activities.Http
.WithContentType(contentType)
.WithResponseHeaders(headers));
public static ActivityBuilder WriteHttpResponse(
public static IActivityBuilder WriteHttpResponse(
this IBuilder builder,
HttpStatusCode statusCode,
string content = default,

View file

@ -1,3 +1,4 @@
using System;
using Elsa.Results;
using Elsa.Services.Models;
using Microsoft.AspNetCore.Http;
@ -8,20 +9,20 @@ namespace Elsa.Activities.Http.Results
{
private readonly IHttpContextAccessor httpContextAccessor;
public RedirectResult(IHttpContextAccessor httpContextAccessor, PathString location, bool permanent)
public RedirectResult(IHttpContextAccessor httpContextAccessor, Uri location, bool permanent)
{
Location = location;
Permanent = permanent;
this.httpContextAccessor = httpContextAccessor;
}
public PathString Location { get; }
public Uri Location { get; }
public bool Permanent { get; }
protected override void Execute(ActivityExecutionContext activityExecutionContext)
{
var response = httpContextAccessor.HttpContext.Response;
response.Redirect(Location, Permanent);
response.Redirect(Location.ToString(), Permanent);
}
}
}

View file

@ -8,10 +8,10 @@ namespace Elsa.Activities.MassTransit
{
public static class CancelScheduledMassTransitMessageBuilderExtensions
{
public static ActivityBuilder CancelScheduledMassTransitMessage(this IBuilder builder, Action<CancelScheduledMassTransitMessage>? setup = default) => builder.Then(setup);
public static ActivityBuilder CancelScheduledMassTransitMessage(this IBuilder builder, IWorkflowExpression<Guid> value) => builder.CancelScheduledMassTransitMessage(x => x.WithTokenId(value));
public static ActivityBuilder CancelScheduledMassTransitMessage(this IBuilder builder, Func<ActivityExecutionContext, Guid> value) => builder.CancelScheduledMassTransitMessage(x => x.WithTokenId(value));
public static ActivityBuilder CancelScheduledMassTransitMessage(this IBuilder builder, Func<Guid> value) => builder.CancelScheduledMassTransitMessage(x => x.WithTokenId(value));
public static ActivityBuilder CancelScheduledMassTransitMessage(this IBuilder builder, Guid value) => builder.CancelScheduledMassTransitMessage(x => x.WithTokenId(value));
public static IActivityBuilder CancelScheduledMassTransitMessage(this IBuilder builder, Action<CancelScheduledMassTransitMessage>? setup = default) => builder.Then(setup);
public static IActivityBuilder CancelScheduledMassTransitMessage(this IBuilder builder, IWorkflowExpression<Guid> value) => builder.CancelScheduledMassTransitMessage(x => x.WithTokenId(value));
public static IActivityBuilder CancelScheduledMassTransitMessage(this IBuilder builder, Func<ActivityExecutionContext, Guid> value) => builder.CancelScheduledMassTransitMessage(x => x.WithTokenId(value));
public static IActivityBuilder CancelScheduledMassTransitMessage(this IBuilder builder, Func<Guid> value) => builder.CancelScheduledMassTransitMessage(x => x.WithTokenId(value));
public static IActivityBuilder CancelScheduledMassTransitMessage(this IBuilder builder, Guid value) => builder.CancelScheduledMassTransitMessage(x => x.WithTokenId(value));
}
}

View file

@ -8,10 +8,10 @@ namespace Elsa.Activities.MassTransit
{
public static class PublishMassTransitMessageBuilderExtensions
{
public static ActivityBuilder PublishMassTransitMessage(this IBuilder builder, Action<PublishMassTransitMessage>? setup = default) => builder.Then(setup);
public static ActivityBuilder PublishMassTransitMessage(this IBuilder builder, IWorkflowExpression message) => builder.PublishMassTransitMessage(x => x.WithMessage(message));
public static ActivityBuilder PublishMassTransitMessage<T>(this IBuilder builder, Func<ActivityExecutionContext, T> message) => builder.PublishMassTransitMessage(x => x.WithMessage(message));
public static ActivityBuilder PublishMassTransitMessage<T>(this IBuilder builder, Func<T> message) => builder.PublishMassTransitMessage(x => x.WithMessage(message));
public static ActivityBuilder PublishMassTransitMessage<T>(this IBuilder builder, T message) => builder.PublishMassTransitMessage(x => x.WithMessage(message));
public static IActivityBuilder PublishMassTransitMessage(this IBuilder builder, Action<PublishMassTransitMessage>? setup = default) => builder.Then(setup);
public static IActivityBuilder PublishMassTransitMessage(this IBuilder builder, IWorkflowExpression message) => builder.PublishMassTransitMessage(x => x.WithMessage(message));
public static IActivityBuilder PublishMassTransitMessage<T>(this IBuilder builder, Func<ActivityExecutionContext, T> message) => builder.PublishMassTransitMessage(x => x.WithMessage(message));
public static IActivityBuilder PublishMassTransitMessage<T>(this IBuilder builder, Func<T> message) => builder.PublishMassTransitMessage(x => x.WithMessage(message));
public static IActivityBuilder PublishMassTransitMessage<T>(this IBuilder builder, T message) => builder.PublishMassTransitMessage(x => x.WithMessage(message));
}
}

View file

@ -6,8 +6,8 @@ namespace Elsa.Activities.MassTransit
{
public static class ReceiveMassTransitMessageBuilderExtensions
{
public static ActivityBuilder ReceiveMassTransitMessage(this IBuilder builder, Action<ReceiveMassTransitMessage>? setup = default) => builder.Then(setup);
public static ActivityBuilder ReceiveMassTransitMessage(this IBuilder builder, Type messageType) => builder.ReceiveMassTransitMessage(x => x.WithMessageType(messageType));
public static ActivityBuilder ReceiveMassTransitMessage<T>(this IBuilder builder, Type messageType) => builder.ReceiveMassTransitMessage(x => x.WithMessageType<T>());
public static IActivityBuilder ReceiveMassTransitMessage(this IBuilder builder, Action<ReceiveMassTransitMessage>? setup = default) => builder.Then(setup);
public static IActivityBuilder ReceiveMassTransitMessage(this IBuilder builder, Type messageType) => builder.ReceiveMassTransitMessage(x => x.WithMessageType(messageType));
public static IActivityBuilder ReceiveMassTransitMessage<T>(this IBuilder builder, Type messageType) => builder.ReceiveMassTransitMessage(x => x.WithMessageType<T>());
}
}

View file

@ -9,9 +9,9 @@ namespace Elsa.Activities.MassTransit
{
public static class ScheduleSendMassTransitMessageBuilderExtensions
{
public static ActivityBuilder ScheduleSendMassTransitMessage(this IBuilder builder, Action<ScheduleSendMassTransitMessage>? setup = default) => builder.Then(setup);
public static IActivityBuilder ScheduleSendMassTransitMessage(this IBuilder builder, Action<ScheduleSendMassTransitMessage>? setup = default) => builder.Then(setup);
public static ActivityBuilder ScheduleSendMassTransitMessage(
public static IActivityBuilder ScheduleSendMassTransitMessage(
this IBuilder builder,
IWorkflowExpression message,
Uri endpointAddress,
@ -21,7 +21,7 @@ namespace Elsa.Activities.MassTransit
.WithEndpointAddress(endpointAddress)
.WithScheduledTime(scheduledTime));
public static ActivityBuilder ScheduleSendMassTransitMessage(
public static IActivityBuilder ScheduleSendMassTransitMessage(
this IBuilder builder,
Func<ActivityExecutionContext, object> message,
Uri endpointAddress,
@ -31,7 +31,7 @@ namespace Elsa.Activities.MassTransit
.WithEndpointAddress(endpointAddress)
.WithScheduledTime(scheduledTime));
public static ActivityBuilder ScheduleSendMassTransitMessage(
public static IActivityBuilder ScheduleSendMassTransitMessage(
this IBuilder builder,
Func<object> message,
Uri endpointAddress,
@ -41,7 +41,7 @@ namespace Elsa.Activities.MassTransit
.WithEndpointAddress(endpointAddress)
.WithScheduledTime(scheduledTime));
public static ActivityBuilder ScheduleSendMassTransitMessage(
public static IActivityBuilder ScheduleSendMassTransitMessage(
this IBuilder builder,
object message,
Uri endpointAddress,

View file

@ -8,9 +8,9 @@ namespace Elsa.Activities.MassTransit
{
public static class SendMassTransitMessageBuilderExtensions
{
public static ActivityBuilder SendMassTransitMessage(this IBuilder builder, Action<SendMassTransitMessage>? setup = default) => builder.Then(setup);
public static IActivityBuilder SendMassTransitMessage(this IBuilder builder, Action<SendMassTransitMessage>? setup = default) => builder.Then(setup);
public static ActivityBuilder SendMassTransitMessage(
public static IActivityBuilder SendMassTransitMessage(
this IBuilder builder,
IWorkflowExpression message,
Uri endpointAddress) =>
@ -18,7 +18,7 @@ namespace Elsa.Activities.MassTransit
.WithMessage(message)
.WithEndpointAddress(endpointAddress));
public static ActivityBuilder SendMassTransitMessage(
public static IActivityBuilder SendMassTransitMessage(
this IBuilder builder,
Func<ActivityExecutionContext, object> message,
Uri endpointAddress) =>
@ -26,7 +26,7 @@ namespace Elsa.Activities.MassTransit
.WithMessage(message)
.WithEndpointAddress(endpointAddress));
public static ActivityBuilder SendMassTransitMessage(
public static IActivityBuilder SendMassTransitMessage(
this IBuilder builder,
Func<object> message,
Uri endpointAddress) =>
@ -34,7 +34,7 @@ namespace Elsa.Activities.MassTransit
.WithMessage(message)
.WithEndpointAddress(endpointAddress));
public static ActivityBuilder SendMassTransitMessages(
public static IActivityBuilder SendMassTransitMessages(
this IBuilder builder,
object message,
Uri endpointAddress) =>

View file

@ -27,13 +27,9 @@ namespace Elsa.Activities.Timers
}
[ActivityProperty(Hint = "Specify a CRON expression. See https://crontab.guru/ for help.")]
public IWorkflowExpression<string> CronExpression
{
get => GetState<IWorkflowExpression<string>>(() => new LiteralExpression<string>("* * * * *"));
set => SetState(value);
}
public IWorkflowExpression<string> CronExpression { get; set; } = new CodeExpression<string>("* * * * *");
public Instant? StartTime
private Instant? StartTime
{
get => GetState<Instant?>();
set => SetState(value);

View file

@ -9,10 +9,10 @@ namespace Elsa.Activities.MassTransit
{
public static class CronEventBuilderExtensions
{
public static ActivityBuilder CronEvent(this IBuilder builder, Action<CronEvent>? setup = default) => builder.Then(setup);
public static ActivityBuilder CronEvent(this IBuilder builder, IWorkflowExpression<string> cronExpression) => builder.CronEvent(x => x.WithCronExpression(cronExpression));
public static ActivityBuilder CronEvent(this IBuilder builder, Func<ActivityExecutionContext, string> cronExpression) => builder.CronEvent(x => x.WithCronExpression(cronExpression));
public static ActivityBuilder CronEvent(this IBuilder builder, Func<string> cronExpression) => builder.CronEvent(x => x.WithCronExpression(cronExpression));
public static ActivityBuilder CronEvent(this IBuilder builder, string cronExpression) => builder.CronEvent(x => x.WithCronExpression(cronExpression));
public static IActivityBuilder CronEvent(this IBuilder builder, Action<CronEvent>? setup = default) => builder.Then(setup);
public static IActivityBuilder CronEvent(this IBuilder builder, IWorkflowExpression<string> cronExpression) => builder.CronEvent(x => x.WithCronExpression(cronExpression));
public static IActivityBuilder CronEvent(this IBuilder builder, Func<ActivityExecutionContext, string> cronExpression) => builder.CronEvent(x => x.WithCronExpression(cronExpression));
public static IActivityBuilder CronEvent(this IBuilder builder, Func<string> cronExpression) => builder.CronEvent(x => x.WithCronExpression(cronExpression));
public static IActivityBuilder CronEvent(this IBuilder builder, string cronExpression) => builder.CronEvent(x => x.WithCronExpression(cronExpression));
}
}

View file

@ -10,10 +10,10 @@ namespace Elsa.Activities.MassTransit
{
public static class InstantEventBuilderExtensions
{
public static ActivityBuilder InstantEvent(this IBuilder builder, Action<InstantEvent>? setup = default) => builder.Then(setup);
public static ActivityBuilder InstantEvent(this IBuilder builder, IWorkflowExpression<Instant> instant) => builder.InstantEvent(x => x.WithInstant(instant));
public static ActivityBuilder InstantEvent(this IBuilder builder, Func<ActivityExecutionContext, Instant> instant) => builder.InstantEvent(x => x.WithInstant(instant));
public static ActivityBuilder InstantEvent(this IBuilder builder, Func<Instant> instant) => builder.InstantEvent(x => x.WithInstant(instant));
public static ActivityBuilder InstantEvent(this IBuilder builder, Instant instant) => builder.InstantEvent(x => x.WithInstant(instant));
public static IActivityBuilder InstantEvent(this IBuilder builder, Action<InstantEvent>? setup = default) => builder.Then(setup);
public static IActivityBuilder InstantEvent(this IBuilder builder, IWorkflowExpression<Instant> instant) => builder.InstantEvent(x => x.WithInstant(instant));
public static IActivityBuilder InstantEvent(this IBuilder builder, Func<ActivityExecutionContext, Instant> instant) => builder.InstantEvent(x => x.WithInstant(instant));
public static IActivityBuilder InstantEvent(this IBuilder builder, Func<Instant> instant) => builder.InstantEvent(x => x.WithInstant(instant));
public static IActivityBuilder InstantEvent(this IBuilder builder, Instant instant) => builder.InstantEvent(x => x.WithInstant(instant));
}
}

View file

@ -24,13 +24,16 @@ namespace Elsa.Activities.Timers
}
[ActivityProperty(Hint = "An expression that evaluates to a Duration value")]
public IWorkflowExpression<Duration> Timeout
{
get => GetState<IWorkflowExpression<Duration>>(() => new LiteralExpression<Duration>("00:01:00"));
set => SetState(value);
}
public Instant? StartTime
public IWorkflowExpression<Duration> Timeout { get; set; }
// [ActivityProperty(Hint = "An expression that evaluates to a Duration value")]
// public IWorkflowExpression<Duration> Timeout
// {
// get => GetState<IWorkflowExpression<Duration>>(() => new LiteralExpression<Duration>("00:01:00"));
// set => SetState(value);
// }
private Instant? StartTime
{
get => GetState<Instant?>();
set => SetState(value);

View file

@ -10,10 +10,10 @@ namespace Elsa.Activities.MassTransit
{
public static class TimerEventBuilderExtensions
{
public static ActivityBuilder TimerEvent(this IBuilder builder, Action<TimerEvent>? setup = default) => builder.Then(setup);
public static ActivityBuilder TimerEvent(this IBuilder builder, IWorkflowExpression<Duration> value) => builder.TimerEvent(x => x.WithTimeout(value));
public static ActivityBuilder TimerEvent(this IBuilder builder, Func<ActivityExecutionContext, Duration> value) => builder.TimerEvent(x => x.WithTimeout(value));
public static ActivityBuilder TimerEvent(this IBuilder builder, Func<Duration> value) => builder.TimerEvent(x => x.WithTimeout(value));
public static ActivityBuilder TimerEvent(this IBuilder builder, Duration value) => builder.TimerEvent(x => x.WithTimeout(value));
public static IActivityBuilder TimerEvent(this IBuilder builder, Action<TimerEvent>? setup = default) => builder.Then(setup);
public static IActivityBuilder TimerEvent(this IBuilder builder, IWorkflowExpression<Duration> value) => builder.TimerEvent(x => x.WithTimeout(value));
public static IActivityBuilder TimerEvent(this IBuilder builder, Func<ActivityExecutionContext, Duration> value) => builder.TimerEvent(x => x.WithTimeout(value));
public static IActivityBuilder TimerEvent(this IBuilder builder, Func<Duration> value) => builder.TimerEvent(x => x.WithTimeout(value));
public static IActivityBuilder TimerEvent(this IBuilder builder, Duration value) => builder.TimerEvent(x => x.WithTimeout(value));
}
}

View file

@ -0,0 +1,17 @@
using System;
using Elsa.Services;
using Elsa.Services.Models;
namespace Elsa.Builders
{
public interface IActivityBuilder : IBuilder
{
IWorkflowBuilder WorkflowBuilder { get; }
IActivity Activity { get; }
IActivityBuilder Add<T>(Action<T>? setup = default) where T : class, IActivity;
IOutcomeBuilder When(string? outcome);
IActivityBuilder Then(IActivityBuilder targetActivity);
IActivity BuildActivity();
Workflow Build();
}
}

View file

@ -0,0 +1,11 @@
using System;
using Elsa.Services;
namespace Elsa.Builders
{
public interface IBuilder
{
IActivityBuilder Then<T>(Action<T>? setup = default, Action<IActivityBuilder>? branch = default) where T : class, IActivity;
IActivityBuilder Then<T>(T activity, Action<IActivityBuilder>? branch = default) where T : class, IActivity;
}
}

View file

@ -0,0 +1,14 @@
using System;
using Elsa.Services.Models;
namespace Elsa.Builders
{
public interface IConnectionBuilder
{
IWorkflowBuilder WorkflowBuilder { get; }
Func<IActivityBuilder> Source { get; }
Func<IActivityBuilder> Target{ get; }
string Outcome { get; }
Connection BuildConnection();
}
}

View file

@ -0,0 +1,14 @@
using System;
using Elsa.Services;
using Elsa.Services.Models;
namespace Elsa.Builders
{
public interface IOutcomeBuilder : IBuilder
{
IWorkflowBuilder WorkflowBuilder { get; }
IActivityBuilder Source { get; }
string? Outcome { get; }
Workflow Build();
}
}

View file

@ -22,14 +22,14 @@ namespace Elsa.Builders
IWorkflowBuilder AsTransient();
IWorkflowBuilder WithDeleteCompletedInstances(bool value);
IWorkflowBuilder WithPersistenceBehavior(WorkflowPersistenceBehavior value);
T New<T>(Action<T>? setup = default, Action<ActivityBuilder>? branch = default) where T : class, IActivity;
T New<T>(T activity, Action<ActivityBuilder>? branch = default) where T : class, IActivity;
ActivityBuilder StartWith<T>(Action<T>? setup = default, Action<ActivityBuilder>? branch = default) where T : class, IActivity;
ActivityBuilder StartWith<T>(T activity, Action<ActivityBuilder>? branch = default) where T : class, IActivity;
ActivityBuilder Add<T>(Action<T>? setup = default, Action<ActivityBuilder>? branch = default) where T : class, IActivity;
ActivityBuilder Add<T>(T activity, Action<ActivityBuilder>? branch = default) where T : class, IActivity;
ConnectionBuilder Connect(ActivityBuilder source, ActivityBuilder target, string? outcome = default);
ConnectionBuilder Connect(Func<ActivityBuilder> source, Func<ActivityBuilder> target, string? outcome = default);
T New<T>(Action<T>? setup = default, Action<IActivityBuilder>? branch = default) where T : class, IActivity;
T New<T>(T activity, Action<IActivityBuilder>? branch = default) where T : class, IActivity;
IActivityBuilder StartWith<T>(Action<T>? setup = default, Action<IActivityBuilder>? branch = default) where T : class, IActivity;
IActivityBuilder StartWith<T>(T activity, Action<IActivityBuilder>? branch = default) where T : class, IActivity;
IActivityBuilder Add<T>(Action<T>? setup = default, Action<IActivityBuilder>? branch = default) where T : class, IActivity;
IActivityBuilder Add<T>(T activity, Action<IActivityBuilder>? branch = default) where T : class, IActivity;
IConnectionBuilder Connect(IActivityBuilder source, IActivityBuilder target, string outcome = OutcomeNames.Done);
IConnectionBuilder Connect(Func<IActivityBuilder> source, Func<IActivityBuilder> target, string outcome = OutcomeNames.Done);
Workflow Build();
Workflow Build(IWorkflow workflow);
Workflow Build(Type workflowType);

View file

@ -6,6 +6,6 @@ namespace Elsa.Activities.ControlFlow
{
public static class CompleteBuilderExtensions
{
public static ActivityBuilder Complete(this IBuilder builder, Action<Complete>? setup = default) => builder.Then(setup);
public static IActivityBuilder Complete(this IBuilder builder, Action<Complete>? setup = default) => builder.Then(setup);
}
}

View file

@ -8,62 +8,62 @@ namespace Elsa.Activities.ControlFlow
{
public static class ForBuilderExtensions
{
public static OutcomeBuilder For(this IBuilder builder, Action<For> setup, Action<OutcomeBuilder> iteration) => For(builder.Then(setup), iteration);
public static IOutcomeBuilder For(this IBuilder builder, Action<For> setup, Action<IOutcomeBuilder> iteration) => For(builder.Then(setup), iteration);
public static OutcomeBuilder For(
public static IOutcomeBuilder For(
this IBuilder builder,
IWorkflowExpression<int> start,
IWorkflowExpression<int> end,
IWorkflowExpression<int> step,
Action<OutcomeBuilder> iteration) =>
Action<IOutcomeBuilder> iteration) =>
builder.For(a => a.WithStart(start).WithEnd(end).WithStep(step), iteration);
public static OutcomeBuilder For(
public static IOutcomeBuilder For(
this IBuilder builder,
Func<ActivityExecutionContext, int> start,
Func<ActivityExecutionContext, int> end,
Func<ActivityExecutionContext, int> step,
Action<OutcomeBuilder> iteration) =>
Action<IOutcomeBuilder> iteration) =>
builder.For(a => a.WithStart(start).WithEnd(end).WithStep(step), iteration);
public static OutcomeBuilder For(
public static IOutcomeBuilder For(
this IBuilder builder,
Func<ActivityExecutionContext, int> start,
Func<ActivityExecutionContext, int> end,
Action<OutcomeBuilder> setupIteration) =>
Action<IOutcomeBuilder> setupIteration) =>
builder.For(a => a.WithStart(start).WithEnd(end).WithStep(1), setupIteration);
public static OutcomeBuilder For(
public static IOutcomeBuilder For(
this IBuilder builder,
Func<int> start,
Func<int> end,
Func<int> step,
Action<OutcomeBuilder> iteration) =>
Action<IOutcomeBuilder> iteration) =>
builder.For(a => a.WithStart(start).WithEnd(end).WithStep(step), iteration);
public static OutcomeBuilder For(
public static IOutcomeBuilder For(
this IBuilder builder,
Func<int> start,
Func<int> end,
Action<OutcomeBuilder> setupIteration) =>
Action<IOutcomeBuilder> setupIteration) =>
For(builder.Then<For>(a => a.WithStart(start).WithEnd(end).WithStep(1)), setupIteration);
public static OutcomeBuilder For(
public static IOutcomeBuilder For(
this IBuilder builder,
int start,
int end,
int step,
Action<OutcomeBuilder> iteration) =>
Action<IOutcomeBuilder> iteration) =>
builder.For(a => a.WithStart(start).WithEnd(end).WithStep(step), iteration);
public static OutcomeBuilder For(
public static IOutcomeBuilder For(
this IBuilder builder,
int start,
int end,
Action<OutcomeBuilder> iteration) =>
Action<IOutcomeBuilder> iteration) =>
builder.For(start, end, 1, iteration);
private static OutcomeBuilder For(ActivityBuilder @for, Action<OutcomeBuilder> iteration)
private static IOutcomeBuilder For(IActivityBuilder @for, Action<IOutcomeBuilder> iteration)
{
iteration.Invoke(@for.When(OutcomeNames.Iterate));
return @for.When(OutcomeNames.Done);

View file

@ -10,33 +10,33 @@ namespace Elsa.Activities.ControlFlow
{
public static class ForEachBuilderExtensions
{
public static OutcomeBuilder ForEach(this IBuilder builder, Action<ForEach> setup, Action<OutcomeBuilder> iteration) => ForEach(builder.Then(setup), iteration);
public static IOutcomeBuilder ForEach(this IBuilder builder, Action<ForEach> setup, Action<IOutcomeBuilder> iteration) => ForEach(builder.Then(setup), iteration);
public static OutcomeBuilder ForEach(
public static IOutcomeBuilder ForEach(
this IBuilder builder,
IWorkflowExpression<ICollection> collection,
Action<OutcomeBuilder> iteration) =>
Action<IOutcomeBuilder> iteration) =>
builder.ForEach(a => a.WithCollection(collection), iteration);
public static OutcomeBuilder ForEach(
public static IOutcomeBuilder ForEach(
this IBuilder builder,
Func<ActivityExecutionContext, ICollection> collection,
Action<OutcomeBuilder> iteration) =>
Action<IOutcomeBuilder> iteration) =>
builder.ForEach(a => a.WithCollection(collection), iteration);
public static OutcomeBuilder ForEach(
public static IOutcomeBuilder ForEach(
this IBuilder builder,
Func<ICollection> collection,
Action<OutcomeBuilder> iteration) =>
Action<IOutcomeBuilder> iteration) =>
builder.ForEach(a => a.WithCollection(collection), iteration);
public static OutcomeBuilder ForEach(
public static IOutcomeBuilder ForEach(
this IBuilder builder,
ICollection collection,
Action<OutcomeBuilder> iteration) =>
Action<IOutcomeBuilder> iteration) =>
builder.ForEach(a => a.WithCollection(collection), iteration);
private static OutcomeBuilder ForEach(ActivityBuilder forEach, Action<OutcomeBuilder> iteration)
private static IOutcomeBuilder ForEach(IActivityBuilder forEach, Action<IOutcomeBuilder> iteration)
{
iteration.Invoke(forEach.When(OutcomeNames.Iterate));
return forEach.When(OutcomeNames.Done);

View file

@ -5,16 +5,16 @@ namespace Elsa.Activities.ControlFlow
{
public class ForkBuilder
{
private readonly ActivityBuilder activityBuilder;
private readonly IActivityBuilder activityBuilder;
private readonly Fork fork;
public ForkBuilder(ActivityBuilder activityBuilder)
public ForkBuilder(IActivityBuilder activityBuilder)
{
this.activityBuilder = activityBuilder;
fork = (Fork)activityBuilder.Activity;
}
public OutcomeBuilder When(string branch)
public IOutcomeBuilder When(string branch)
{
fork.Branches.Add(branch);
return activityBuilder.When(branch);

View file

@ -8,12 +8,12 @@ namespace Elsa.Activities.ControlFlow
{
public static class IfElseBuilderExtensions
{
public static OutcomeBuilder IfElse(this IBuilder builder, IWorkflowExpression<bool> condition, Action<OutcomeBuilder> trueBranch, Action<OutcomeBuilder>? falseBranch = default) => IfElse(builder.Then<IfElse>(x => x.Condition = condition), trueBranch, falseBranch);
public static OutcomeBuilder IfElse(this IBuilder builder, Func<ActivityExecutionContext, bool> condition, Action<OutcomeBuilder> trueBranch, Action<OutcomeBuilder>? falseBranch = default) => builder.IfElse(new CodeExpression<bool>(condition), trueBranch, falseBranch);
public static OutcomeBuilder IfElse(this IBuilder builder, Func<bool> condition, Action<OutcomeBuilder> trueBranch, Action<OutcomeBuilder>? falseBranch = default) => builder.IfElse(new CodeExpression<bool>(condition), trueBranch, falseBranch);
public static OutcomeBuilder IfElse(this IBuilder builder, bool condition, Action<OutcomeBuilder> trueBranch, Action<OutcomeBuilder>? falseBranch = default) => builder.IfElse(new CodeExpression<bool>(() => condition), trueBranch, falseBranch);
public static IOutcomeBuilder IfElse(this IBuilder builder, IWorkflowExpression<bool> condition, Action<IOutcomeBuilder> trueBranch, Action<IOutcomeBuilder>? falseBranch = default) => IfElse(builder.Then<IfElse>(x => x.Condition = condition), trueBranch, falseBranch);
public static IOutcomeBuilder IfElse(this IBuilder builder, Func<ActivityExecutionContext, bool> condition, Action<IOutcomeBuilder> trueBranch, Action<IOutcomeBuilder>? falseBranch = default) => builder.IfElse(new CodeExpression<bool>(condition), trueBranch, falseBranch);
public static IOutcomeBuilder IfElse(this IBuilder builder, Func<bool> condition, Action<IOutcomeBuilder> trueBranch, Action<IOutcomeBuilder>? falseBranch = default) => builder.IfElse(new CodeExpression<bool>(condition), trueBranch, falseBranch);
public static IOutcomeBuilder IfElse(this IBuilder builder, bool condition, Action<IOutcomeBuilder> trueBranch, Action<IOutcomeBuilder>? falseBranch = default) => builder.IfElse(new CodeExpression<bool>(() => condition), trueBranch, falseBranch);
private static OutcomeBuilder IfElse(ActivityBuilder ifElse, Action<OutcomeBuilder> trueBranch, Action<OutcomeBuilder>? falseBranch = default)
private static IOutcomeBuilder IfElse(IActivityBuilder ifElse, Action<IOutcomeBuilder> trueBranch, Action<IOutcomeBuilder>? falseBranch = default)
{
trueBranch.Invoke(ifElse.When(OutcomeNames.True));
falseBranch?.Invoke(ifElse.When(OutcomeNames.False));

View file

@ -5,6 +5,6 @@ namespace Elsa.Activities.ControlFlow
{
public static class JoinBuilderExtensions
{
public static ActivityBuilder Join(this IBuilder builder, Join.JoinMode mode) => builder.Then<Join>(x => x.WithMode(mode));
public static IActivityBuilder Join(this IBuilder builder, Join.JoinMode mode) => builder.Then<Join>(x => x.WithMode(mode));
}
}

View file

@ -5,16 +5,16 @@ namespace Elsa.Activities.ControlFlow
{
public class SwitchBuilder
{
private readonly ActivityBuilder activityBuilder;
private readonly IActivityBuilder activityBuilder;
private readonly Switch @switch;
public SwitchBuilder(ActivityBuilder activityBuilder)
public SwitchBuilder(IActivityBuilder activityBuilder)
{
this.activityBuilder = activityBuilder;
@switch = (Switch)activityBuilder.Activity;
}
public OutcomeBuilder When(string @case)
public IOutcomeBuilder When(string @case)
{
@switch.Cases.Add(@case);
return activityBuilder.When(@case);

View file

@ -8,12 +8,12 @@ namespace Elsa.Activities.ControlFlow
{
public static class WhileBuilderExtensions
{
public static OutcomeBuilder While(this IBuilder builder, IWorkflowExpression<bool> condition, Action<OutcomeBuilder> iteration) => While(builder.Then<While>(x => x.WithCondition(condition)), iteration);
public static OutcomeBuilder While(this IBuilder builder, Func<ActivityExecutionContext, bool> condition, Action<OutcomeBuilder> iteration) => builder.While(new CodeExpression<bool>(condition), iteration);
public static OutcomeBuilder While(this IBuilder builder, Func<bool> condition, Action<OutcomeBuilder> iteration) => builder.While(new CodeExpression<bool>(condition), iteration);
public static OutcomeBuilder While(this IBuilder builder, bool condition, Action<OutcomeBuilder> iteration) => builder.While(new CodeExpression<bool>(() => condition), iteration);
public static IOutcomeBuilder While(this IBuilder builder, IWorkflowExpression<bool> condition, Action<IOutcomeBuilder> iteration) => While(builder.Then<While>(x => x.WithCondition(condition)), iteration);
public static IOutcomeBuilder While(this IBuilder builder, Func<ActivityExecutionContext, bool> condition, Action<IOutcomeBuilder> iteration) => builder.While(new CodeExpression<bool>(condition), iteration);
public static IOutcomeBuilder While(this IBuilder builder, Func<bool> condition, Action<IOutcomeBuilder> iteration) => builder.While(new CodeExpression<bool>(condition), iteration);
public static IOutcomeBuilder While(this IBuilder builder, bool condition, Action<IOutcomeBuilder> iteration) => builder.While(new CodeExpression<bool>(() => condition), iteration);
private static OutcomeBuilder While(ActivityBuilder @while, Action<OutcomeBuilder> iteration)
private static IOutcomeBuilder While(IActivityBuilder @while, Action<IOutcomeBuilder> iteration)
{
iteration.Invoke(@while.When(OutcomeNames.Iterate));
return @while.When(OutcomeNames.Done);

View file

@ -8,9 +8,9 @@ namespace Elsa.Activities.Primitives
{
public static class CorrelateBuilderExtensions
{
public static ActivityBuilder Correlate(this IBuilder builder, IWorkflowExpression<string> correlationId) => builder.Then<Correlate>(x => x.WithValue(correlationId));
public static ActivityBuilder Correlate(this IBuilder builder, Func<ActivityExecutionContext, string> correlationId) => builder.Then<Correlate>(x => x.WithValue(correlationId));
public static ActivityBuilder Correlate(this IBuilder builder, Func<string> correlationId) => builder.Then<Correlate>(x => x.WithValue(correlationId));
public static ActivityBuilder Correlate(this IBuilder builder, string correlationId) => builder.Then<Correlate>(x => x.WithValue(correlationId));
public static IActivityBuilder Correlate(this IBuilder builder, IWorkflowExpression<string> correlationId) => builder.Then<Correlate>(x => x.WithValue(correlationId));
public static IActivityBuilder Correlate(this IBuilder builder, Func<ActivityExecutionContext, string> correlationId) => builder.Then<Correlate>(x => x.WithValue(correlationId));
public static IActivityBuilder Correlate(this IBuilder builder, Func<string> correlationId) => builder.Then<Correlate>(x => x.WithValue(correlationId));
public static IActivityBuilder Correlate(this IBuilder builder, string correlationId) => builder.Then<Correlate>(x => x.WithValue(correlationId));
}
}

View file

@ -8,30 +8,30 @@ namespace Elsa.Activities.Primitives
{
public static class SetVariableBuilderExtensions
{
public static ActivityBuilder SetVariable(this IBuilder builder, string variableName, IWorkflowExpression<object> value) => builder.Then<SetVariable>(x =>
public static IActivityBuilder SetVariable(this IBuilder builder, string variableName, IWorkflowExpression<object> value) => builder.Then<SetVariable>(x =>
{
x.VariableName = variableName;
x.Value = value;
});
public static ActivityBuilder SetVariable(this IBuilder builder, string variableName, CodeExpression<object> value) => builder.SetVariable(variableName, (IWorkflowExpression<object>)value);
public static ActivityBuilder SetVariable(this IBuilder builder, string variableName, Func<ActivityExecutionContext, object> value) => builder.SetVariable(variableName, new CodeExpression<object>(value));
public static IActivityBuilder SetVariable(this IBuilder builder, string variableName, CodeExpression<object> value) => builder.SetVariable(variableName, (IWorkflowExpression<object>)value);
public static IActivityBuilder SetVariable(this IBuilder builder, string variableName, Func<ActivityExecutionContext, object> value) => builder.SetVariable(variableName, new CodeExpression<object>(value));
public static ActivityBuilder SetVariable(this IBuilder builder, string variableName, Func<object, object> value) =>
public static IActivityBuilder SetVariable(this IBuilder builder, string variableName, Func<object, object> value) =>
builder.SetVariable(variableName, new CodeExpression<object>(context =>
{
var currentValue = context.GetVariable(variableName);
return value(currentValue);
}));
public static ActivityBuilder SetVariable<T>(this IBuilder builder, string variableName, Func<T, T> value) =>
public static IActivityBuilder SetVariable<T>(this IBuilder builder, string variableName, Func<T, T> value) =>
builder.SetVariable(variableName, new CodeExpression<object>(context =>
{
var currentValue = context.GetVariable<T>(variableName);
return value(currentValue);
}));
public static ActivityBuilder SetVariable(this IBuilder builder, string variableName, Func<object> value) => builder.SetVariable(variableName, (IWorkflowExpression<object>)new CodeExpression<object>(value));
public static ActivityBuilder SetVariable<T>(this IBuilder builder, string variableName, T value) => builder.SetVariable(variableName, () => value);
public static IActivityBuilder SetVariable(this IBuilder builder, string variableName, Func<object> value) => builder.SetVariable(variableName, (IWorkflowExpression<object>)new CodeExpression<object>(value));
public static IActivityBuilder SetVariable<T>(this IBuilder builder, string variableName, T value) => builder.SetVariable(variableName, () => value);
}
}

View file

@ -8,9 +8,9 @@ namespace Elsa.Activities.Signaling
{
public static class SignaledBuilderExtensions
{
public static ActivityBuilder Signaled(this IBuilder builder, IWorkflowExpression<string> signal) => builder.Then<Signaled>(x => x.WithSignal(signal));
public static ActivityBuilder Signaled(this IBuilder builder, Func<ActivityExecutionContext, string> signal) => builder.Then<Signaled>(x => x.WithSignal(signal));
public static ActivityBuilder Signaled(this IBuilder builder, Func<string> signal) => builder.Then<Signaled>(x => x.WithSignal(signal));
public static ActivityBuilder Signaled(this IBuilder builder, string signal) => builder.Then<Signaled>(x => x.WithSignal(signal));
public static IActivityBuilder Signaled(this IBuilder builder, IWorkflowExpression<string> signal) => builder.Then<Signaled>(x => x.WithSignal(signal));
public static IActivityBuilder Signaled(this IBuilder builder, Func<ActivityExecutionContext, string> signal) => builder.Then<Signaled>(x => x.WithSignal(signal));
public static IActivityBuilder Signaled(this IBuilder builder, Func<string> signal) => builder.Then<Signaled>(x => x.WithSignal(signal));
public static IActivityBuilder Signaled(this IBuilder builder, string signal) => builder.Then<Signaled>(x => x.WithSignal(signal));
}
}

View file

@ -8,9 +8,9 @@ namespace Elsa.Activities.Signaling
{
public static class TriggerEventBuilderExtensions
{
public static ActivityBuilder TriggerEvent(this IBuilder builder, IWorkflowExpression<string> activityType, IWorkflowExpression<string>? correlationId = default, IWorkflowExpression? input = default) => builder.Then<TriggerEvent>(x => x.WithActivityType(activityType).WithCorrelationId(correlationId).WithInput(input));
public static ActivityBuilder TriggerEvent(this IBuilder builder, Func<ActivityExecutionContext, string> activityType, Func<ActivityExecutionContext, string>? correlationId = default, Func<ActivityExecutionContext, object>? input = default) => builder.Then<TriggerEvent>(x => x.WithActivityType(activityType).WithCorrelationId(correlationId).WithInput(input));
public static ActivityBuilder TriggerEvent(this IBuilder builder, Func<string> activityType, Func<string>? correlationId = default, Func<object>? input = default) => builder.Then<TriggerEvent>(x => x.WithActivityType(activityType).WithCorrelationId(correlationId).WithInput(input));
public static ActivityBuilder TriggerEvent(this IBuilder builder, string activityType, string? correlationId = default, object? input = default) => builder.Then<TriggerEvent>(x => x.WithActivityType(activityType).WithCorrelationId(correlationId).WithInput(input));
public static IActivityBuilder TriggerEvent(this IBuilder builder, IWorkflowExpression<string> activityType, IWorkflowExpression<string>? correlationId = default, IWorkflowExpression? input = default) => builder.Then<TriggerEvent>(x => x.WithActivityType(activityType).WithCorrelationId(correlationId).WithInput(input));
public static IActivityBuilder TriggerEvent(this IBuilder builder, Func<ActivityExecutionContext, string> activityType, Func<ActivityExecutionContext, string>? correlationId = default, Func<ActivityExecutionContext, object>? input = default) => builder.Then<TriggerEvent>(x => x.WithActivityType(activityType).WithCorrelationId(correlationId).WithInput(input));
public static IActivityBuilder TriggerEvent(this IBuilder builder, Func<string> activityType, Func<string>? correlationId = default, Func<object>? input = default) => builder.Then<TriggerEvent>(x => x.WithActivityType(activityType).WithCorrelationId(correlationId).WithInput(input));
public static IActivityBuilder TriggerEvent(this IBuilder builder, string activityType, string? correlationId = default, object? input = default) => builder.Then<TriggerEvent>(x => x.WithActivityType(activityType).WithCorrelationId(correlationId).WithInput(input));
}
}

View file

@ -8,9 +8,9 @@ namespace Elsa.Activities.Signaling
{
public static class TriggerSignalBuilderExtensions
{
public static ActivityBuilder TriggerSignal(this IBuilder builder, IWorkflowExpression<string> signal, IWorkflowExpression<string>? correlationId = default, IWorkflowExpression? input = default) => builder.Then<TriggerSignal>(x => x.WithSignal(signal).WithCorrelationId(correlationId).WithInput(input));
public static ActivityBuilder TriggerSignal(this IBuilder builder, Func<ActivityExecutionContext, string> signal, Func<ActivityExecutionContext, string>? correlationId = default, Func<ActivityExecutionContext, object>? input = default) => builder.Then<TriggerSignal>(x => x.WithSignal(signal).WithCorrelationId(correlationId).WithInput(input));
public static ActivityBuilder TriggerSignal(this IBuilder builder, Func<string> signal, Func<string>? correlationId = default, Func<object>? input = default) => builder.Then<TriggerSignal>(x => x.WithSignal(signal).WithCorrelationId(correlationId).WithInput(input));
public static ActivityBuilder TriggerSignal(this IBuilder builder, string signal, string? correlationId = default, object? input = default) => builder.Then<TriggerSignal>(x => x.WithSignal(signal).WithCorrelationId(correlationId).WithInput(input));
public static IActivityBuilder TriggerSignal(this IBuilder builder, IWorkflowExpression<string> signal, IWorkflowExpression<string>? correlationId = default, IWorkflowExpression? input = default) => builder.Then<TriggerSignal>(x => x.WithSignal(signal).WithCorrelationId(correlationId).WithInput(input));
public static IActivityBuilder TriggerSignal(this IBuilder builder, Func<ActivityExecutionContext, string> signal, Func<ActivityExecutionContext, string>? correlationId = default, Func<ActivityExecutionContext, object>? input = default) => builder.Then<TriggerSignal>(x => x.WithSignal(signal).WithCorrelationId(correlationId).WithInput(input));
public static IActivityBuilder TriggerSignal(this IBuilder builder, Func<string> signal, Func<string>? correlationId = default, Func<object>? input = default) => builder.Then<TriggerSignal>(x => x.WithSignal(signal).WithCorrelationId(correlationId).WithInput(input));
public static IActivityBuilder TriggerSignal(this IBuilder builder, string signal, string? correlationId = default, object? input = default) => builder.Then<TriggerSignal>(x => x.WithSignal(signal).WithCorrelationId(correlationId).WithInput(input));
}
}

View file

@ -4,7 +4,7 @@ using Elsa.Services.Models;
namespace Elsa.Builders
{
public class ActivityBuilder : IBuilder
public class ActivityBuilder : IActivityBuilder
{
public ActivityBuilder(IWorkflowBuilder workflowBuilder, IActivity activity)
{
@ -14,28 +14,13 @@ namespace Elsa.Builders
public IWorkflowBuilder WorkflowBuilder { get; }
public IActivity Activity { get; }
public IActivityBuilder Add<T>(Action<T>? setup = default) where T : class, IActivity => WorkflowBuilder.Add(setup);
public IOutcomeBuilder When(string? outcome) => new OutcomeBuilder(WorkflowBuilder, this, outcome);
public IActivityBuilder Then<T>(Action<T>? setup = null, Action<IActivityBuilder>? branch = null) where T : class, IActivity => When(null).Then(setup, branch);
public ActivityBuilder Add<T>(Action<T>? setup = default) where T : class, IActivity
{
return WorkflowBuilder.Add(setup);
}
public IActivityBuilder Then<T>(T activity, Action<IActivityBuilder>? branch = null) where T : class, IActivity => When(null).Then(activity, branch);
public OutcomeBuilder When(string? outcome)
{
return new OutcomeBuilder(WorkflowBuilder, this, outcome);
}
public ActivityBuilder Then<T>(Action<T>? setup = null, Action<ActivityBuilder>? branch = null) where T : class, IActivity
{
return When(null).Then(setup, branch);
}
public ActivityBuilder Then<T>(T activity, Action<ActivityBuilder>? branch = null) where T : class, IActivity
{
return When(null).Then(activity, branch);
}
public ActivityBuilder Then(ActivityBuilder targetActivity)
public IActivityBuilder Then(IActivityBuilder targetActivity)
{
WorkflowBuilder.Connect(this, targetActivity);
return this;

View file

@ -8,9 +8,9 @@ namespace Elsa.Builders
{
public static class ActivityBuilderExtensions
{
public static ActivityBuilder Then(this IBuilder builder, Func<ActivityExecutionContext, Task<IActivityExecutionResult>> activity) => builder.Then(new Inline(activity));
public static ActivityBuilder Then(this IBuilder builder, Func<ActivityExecutionContext, Task> activity) => builder.Then(new Inline(activity));
public static ActivityBuilder Then(this IBuilder builder, Action<ActivityExecutionContext> activity) => builder.Then(new Inline(activity));
public static ActivityBuilder Then(this IBuilder builder, Action activity) => builder.Then(new Inline(activity));
public static IActivityBuilder Then(this IBuilder builder, Func<ActivityExecutionContext, Task<IActivityExecutionResult>> activity) => builder.Then(new Inline(activity));
public static IActivityBuilder Then(this IBuilder builder, Func<ActivityExecutionContext, Task> activity) => builder.Then(new Inline(activity));
public static IActivityBuilder Then(this IBuilder builder, Action<ActivityExecutionContext> activity) => builder.Then(new Inline(activity));
public static IActivityBuilder Then(this IBuilder builder, Action activity) => builder.Then(new Inline(activity));
}
}

View file

@ -3,14 +3,14 @@ using Elsa.Services.Models;
namespace Elsa.Builders
{
public class ConnectionBuilder
public class ConnectionBuilder : IConnectionBuilder
{
public IWorkflowBuilder WorkflowBuilder { get; }
public Func<ActivityBuilder> Source { get; }
public Func<ActivityBuilder> Target{ get; }
public Func<IActivityBuilder> Source { get; }
public Func<IActivityBuilder> Target{ get; }
public string Outcome { get; }
public ConnectionBuilder(IWorkflowBuilder workflowBuilder, Func<ActivityBuilder> source, Func<ActivityBuilder> target, string? outcome = null)
public ConnectionBuilder(IWorkflowBuilder workflowBuilder, Func<IActivityBuilder> source, Func<IActivityBuilder> target, string outcome = OutcomeNames.Done)
{
Source = source;
Target = target;
@ -18,9 +18,6 @@ namespace Elsa.Builders
Outcome = outcome;
}
public Connection BuildConnection()
{
return new Connection(Source().Activity, Target().Activity, Outcome);
}
public Connection BuildConnection() => new Connection(Source().Activity, Target().Activity, Outcome);
}
}

View file

@ -1,11 +0,0 @@
using System;
using Elsa.Services;
namespace Elsa.Builders
{
public interface IBuilder
{
ActivityBuilder Then<T>(Action<T>? setup = default, Action<ActivityBuilder>? branch = default) where T : class, IActivity;
ActivityBuilder Then<T>(T activity, Action<ActivityBuilder>? branch = default) where T : class, IActivity;
}
}

View file

@ -4,9 +4,9 @@ using Elsa.Services.Models;
namespace Elsa.Builders
{
public class OutcomeBuilder : IBuilder
public class OutcomeBuilder : IOutcomeBuilder
{
public OutcomeBuilder(IWorkflowBuilder workflowBuilder, ActivityBuilder source, string outcome)
public OutcomeBuilder(IWorkflowBuilder workflowBuilder, IActivityBuilder source, string? outcome)
{
WorkflowBuilder = workflowBuilder;
Source = source;
@ -14,20 +14,14 @@ namespace Elsa.Builders
}
public IWorkflowBuilder WorkflowBuilder { get; }
public ActivityBuilder Source { get; }
public string Outcome { get; }
public IActivityBuilder Source { get; }
public string? Outcome { get; }
public ActivityBuilder Then<T>(Action<T>? setup = default, Action<ActivityBuilder>? branch = default) where T : class, IActivity
{
return Then(WorkflowBuilder.Add(setup), branch);
}
public ActivityBuilder Then<T>(T activity, Action<ActivityBuilder>? branch = default) where T : class, IActivity
{
return Then(WorkflowBuilder.Add(activity), branch);
}
private ActivityBuilder Then(ActivityBuilder activityBuilder, Action<ActivityBuilder>? branch = default)
public IActivityBuilder Then<T>(Action<T>? setup = default, Action<IActivityBuilder>? branch = default) where T : class, IActivity => Then(WorkflowBuilder.Add(setup), branch);
public IActivityBuilder Then<T>(T activity, Action<IActivityBuilder>? branch = default) where T : class, IActivity => Then(WorkflowBuilder.Add(activity), branch);
private IActivityBuilder Then(IActivityBuilder activityBuilder, Action<IActivityBuilder>? branch = default)
{
branch?.Invoke(activityBuilder);
WorkflowBuilder.Connect(Source, activityBuilder, Outcome);

View file

@ -8,9 +8,9 @@ namespace Elsa.Builders
{
public static class OutcomeBuilderExtensions
{
public static ActivityBuilder Then(this OutcomeBuilder outcomeBuilder, Func<ActivityExecutionContext, Task<IActivityExecutionResult>> activity, Action<ActivityBuilder>? branch = default) => outcomeBuilder.Then(new Inline(activity), branch);
public static ActivityBuilder Then(this OutcomeBuilder outcomeBuilder, Func<ActivityExecutionContext, Task> activity, Action<ActivityBuilder>? branch = default) => outcomeBuilder.Then(new Inline(activity), branch);
public static ActivityBuilder Then(this OutcomeBuilder outcomeBuilder, Action<ActivityExecutionContext> activity, Action<ActivityBuilder>? branch = default) => outcomeBuilder.Then(new Inline(activity), branch);
public static ActivityBuilder Then(this OutcomeBuilder outcomeBuilder, Action activity, Action<ActivityBuilder>? branch = default) => outcomeBuilder.Then(new Inline(activity), branch);
public static IActivityBuilder Then(this IOutcomeBuilder outcomeBuilder, Func<ActivityExecutionContext, Task<IActivityExecutionResult>> activity, Action<IActivityBuilder>? branch = default) => outcomeBuilder.Then(new Inline(activity), branch);
public static IActivityBuilder Then(this IOutcomeBuilder outcomeBuilder, Func<ActivityExecutionContext, Task> activity, Action<IActivityBuilder>? branch = default) => outcomeBuilder.Then(new Inline(activity), branch);
public static IActivityBuilder Then(this IOutcomeBuilder outcomeBuilder, Action<ActivityExecutionContext> activity, Action<IActivityBuilder>? branch = default) => outcomeBuilder.Then(new Inline(activity), branch);
public static IActivityBuilder Then(this IOutcomeBuilder outcomeBuilder, Action activity, Action<IActivityBuilder>? branch = default) => outcomeBuilder.Then(new Inline(activity), branch);
}
}

View file

@ -126,38 +126,38 @@ namespace Elsa.Builders
return workflow;
}
public T New<T>(T activity, Action<ActivityBuilder>? branch = default) where T : class, IActivity
public T New<T>(T activity, Action<IActivityBuilder>? branch = default) where T : class, IActivity
{
var activityBuilder = new ActivityBuilder(this, activity);
branch?.Invoke(activityBuilder);
return activity;
}
public T New<T>(Action<T>? setup, Action<ActivityBuilder>? branch = default) where T : class, IActivity
public T New<T>(Action<T>? setup, Action<IActivityBuilder>? branch = default) where T : class, IActivity
{
var activity = activityResolver.ResolveActivity<T>();
setup?.Invoke(activity);
return New(activity, branch);
}
public ActivityBuilder StartWith<T>(Action<T>? setup = default, Action<ActivityBuilder>? branch = default) where T : class, IActivity
public IActivityBuilder StartWith<T>(Action<T>? setup = default, Action<IActivityBuilder>? branch = default) where T : class, IActivity
{
var activity = New(setup, branch);
return StartWith(activity, branch);
}
public ActivityBuilder StartWith<T>(T activity, Action<ActivityBuilder>? branch = default) where T : class, IActivity
public IActivityBuilder StartWith<T>(T activity, Action<IActivityBuilder>? branch = default) where T : class, IActivity
{
return Add(activity, branch);
}
public ActivityBuilder Add<T>(Action<T>? setup = default, Action<ActivityBuilder>? branch = default) where T : class, IActivity
public IActivityBuilder Add<T>(Action<T>? setup = default, Action<IActivityBuilder>? branch = default) where T : class, IActivity
{
var activity = New(setup, branch);
return Add(activity, branch);
}
public ActivityBuilder Add<T>(T activity, Action<ActivityBuilder>? branch = default) where T : class, IActivity
public IActivityBuilder Add<T>(T activity, Action<IActivityBuilder>? branch = default) where T : class, IActivity
{
var activityBuilder = new ActivityBuilder(this, activity);
branch?.Invoke(activityBuilder);
@ -165,18 +165,18 @@ namespace Elsa.Builders
return activityBuilder;
}
public ConnectionBuilder Connect(
ActivityBuilder source,
ActivityBuilder target,
string? outcome = default)
public IConnectionBuilder Connect(
IActivityBuilder source,
IActivityBuilder target,
string outcome = OutcomeNames.Done)
{
return Connect(() => source, () => target, outcome);
}
public ConnectionBuilder Connect(
Func<ActivityBuilder> source,
Func<ActivityBuilder> target,
string? outcome = default)
public IConnectionBuilder Connect(
Func<IActivityBuilder> source,
Func<IActivityBuilder> target,
string outcome = OutcomeNames.Done)
{
var connectionBuilder = new ConnectionBuilder(this, source, target, outcome);
@ -184,8 +184,8 @@ namespace Elsa.Builders
return connectionBuilder;
}
public ActivityBuilder Then<T>(Action<T>? setup = default, Action<ActivityBuilder>? branch = default) where T : class, IActivity => StartWith(setup, branch);
public ActivityBuilder Then<T>(T activity, Action<ActivityBuilder>? branch = default) where T : class, IActivity => StartWith(activity, branch);
public IActivityBuilder Then<T>(Action<T>? setup = default, Action<IActivityBuilder>? branch = default) where T : class, IActivity => StartWith(setup, branch);
public IActivityBuilder Then<T>(T activity, Action<IActivityBuilder>? branch = default) where T : class, IActivity => StartWith(activity, branch);
public Workflow Build(IWorkflow workflow)
{

View file

@ -9,18 +9,18 @@ namespace Elsa.Builders
{
public static class WorkflowBuilderExtensions
{
public static ActivityBuilder StartWith(this IWorkflowBuilder builder, Action action) => builder.StartWith(new Inline(action));
public static ActivityBuilder StartWith(this IWorkflowBuilder builder, Action<ActivityExecutionContext> action) => builder.StartWith(new Inline(action));
public static ActivityBuilder StartWith(this IWorkflowBuilder builder, Func<ActivityExecutionContext, Task> action) => builder.StartWith(new Inline(action));
public static ActivityBuilder StartWith(this IWorkflowBuilder builder, Func<ActivityExecutionContext, Task<IActivityExecutionResult>> action) => builder.StartWith(new Inline(action));
public static IActivityBuilder StartWith(this IWorkflowBuilder builder, Action action) => builder.StartWith(new Inline(action));
public static IActivityBuilder StartWith(this IWorkflowBuilder builder, Action<ActivityExecutionContext> action) => builder.StartWith(new Inline(action));
public static IActivityBuilder StartWith(this IWorkflowBuilder builder, Func<ActivityExecutionContext, Task> action) => builder.StartWith(new Inline(action));
public static IActivityBuilder StartWith(this IWorkflowBuilder builder, Func<ActivityExecutionContext, Task<IActivityExecutionResult>> action) => builder.StartWith(new Inline(action));
public static ActivityBuilder SetVariable(this IWorkflowBuilder builder, string variableName, IWorkflowExpression<object> value) => builder.StartWith<SetVariable>(x =>
public static IActivityBuilder SetVariable(this IWorkflowBuilder builder, string variableName, IWorkflowExpression<object> value) => builder.StartWith<SetVariable>(x =>
{
x.VariableName = variableName;
x.Value = value;
});
public static ActivityBuilder SetVariable(this IWorkflowBuilder builder, string variableName, Func<object> value) => builder.SetVariable(variableName, (IWorkflowExpression<object>)new CodeExpression<object>(value));
public static ActivityBuilder SetVariable<T>(this IWorkflowBuilder builder, string variableName, T value) => builder.SetVariable(variableName, () => value);
public static IActivityBuilder SetVariable(this IWorkflowBuilder builder, string variableName, Func<object> value) => builder.SetVariable(variableName, (IWorkflowExpression<object>)new CodeExpression<object>(value));
public static IActivityBuilder SetVariable<T>(this IWorkflowBuilder builder, string variableName, T value) => builder.SetVariable(variableName, () => value);
}
}

View file

@ -122,6 +122,7 @@ namespace Microsoft.Extensions.DependencyInjection
.AddConsumer<RunWorkflow, RunWorkflowHandler>()
.AddAutoMapperProfile<WorkflowDefinitionProfile>(ServiceLifetime.Singleton)
.AddTypeAlias(typeof(CodeExpression<>), "CodeExpression")
.AddTypeAlias<Duration>("Duration")
.AddSerializationHandlers()
.AddMetadataHandlers()
.AddPrimitiveActivities();
@ -151,6 +152,7 @@ namespace Microsoft.Extensions.DependencyInjection
.AddTypeNameValueHandler<OffsetTimeHandler>()
.AddTypeNameValueHandler<YearMonthHandler>()
.AddTypeNameValueHandler<ZonedDateTimeHandler>()
.AddTypeNameValueHandler<CodeExpressionHandler>()
.AddTypeAlias<object>()
.AddTypeAlias<bool>()
.AddTypeAlias<int>()

View file

@ -0,0 +1,32 @@
using System;
using System.Linq;
using System.Reflection;
using Elsa.Expressions;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Elsa.Serialization.Extensions;
namespace Elsa.Serialization.Handlers
{
public sealed class CodeExpressionHandler : IValueHandler
{
public int Priority => 0;
public bool CanSerialize(JToken token, Type type, object value) => typeof(CodeExpression).IsAssignableFrom(type);
public bool CanDeserialize(JToken token) => token.Type == JTokenType.Object && token.GetValue<string>("Type") == TypeName;
private string TypeName => nameof(CodeExpression);
public object? Deserialize(JsonSerializer serializer, JToken token)
{
return default;
}
public void Serialize(JsonWriter writer, JsonSerializer serializer, Type type, JToken token, object? value)
{
var objectToken = new JObject
{
["Type"] = TypeName
};
objectToken.WriteTo(writer, serializer.Converters.ToArray());
}
}
}

View file

@ -1,4 +1,5 @@
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NodaTime;
using NodaTime.Text;
@ -6,6 +7,6 @@ namespace Elsa.Serialization.Handlers
{
public sealed class InstantHandler : PrimitiveValueHandler<Instant>
{
protected override object ParseValue(JToken value) => InstantPattern.ExtendedIso.Parse(value.ToString()).Value;
protected override object ParseValue(JToken value) => InstantPattern.ExtendedIso.Parse(value.ToString(Formatting.None).Trim('\"')).Value;
}
}

View file

@ -1,6 +1,7 @@
using Elsa.Persistence.DocumentDb.Services;
using Elsa.AutoMapper.Extensions;
using Elsa.AutoMapper.Extensions.NodaTime;
using Elsa.Extensions;
using Elsa.Persistence.DocumentDb.Mapping;
using Microsoft.Extensions.DependencyInjection;

View file

@ -1,6 +1,7 @@
using System;
using Elsa.AutoMapper.Extensions;
using Elsa.AutoMapper.Extensions.NodaTime;
using Elsa.Extensions;
using Elsa.Persistence.EntityFrameworkCore.CustomSchema;
using Elsa.Persistence.EntityFrameworkCore.DbContexts;
using Elsa.Persistence.EntityFrameworkCore.Mapping;

View file

@ -12,6 +12,7 @@
<ItemGroup>
<ProjectReference Include="..\..\activities\Elsa.Activities.Console\Elsa.Activities.Console.csproj" />
<ProjectReference Include="..\..\core\Elsa\Elsa.csproj" />
<ProjectReference Include="..\..\providers\Elsa.Persistence.MongoDb\Elsa.Persistence.MongoDb.csproj" />
</ItemGroup>
</Project>

View file

@ -19,10 +19,12 @@ namespace Elsa.Samples.Timers
.ConfigureServices((hostContext, services) =>
{
services
.AddElsa()
.AddTimerActivities(options => options.Configure(timer => timer.SweepInterval = Duration.FromSeconds(5)))
.AddWorkflow<RecurringTaskWorkflow>()
.AddWorkflow<CronTaskWorkflow>();
.AddElsa(options =>
options.UseMongoDbWorkflowStores("Elsa_Samples_Timers", "mongodb://localhost"))
.AddTimerActivities(options =>
options.Configure(timer => timer.SweepInterval = Duration.FromSeconds(5)))
.AddWorkflow<RecurringTaskWorkflow>();
//.AddWorkflow<CronTaskWorkflow>();
});
}
}

View file

@ -2,6 +2,8 @@ using System;
using Elsa.Activities.Console;
using Elsa.Activities.MassTransit;
using Elsa.Builders;
using Elsa.Expressions;
using Elsa.Models;
using NodaTime;
namespace Elsa.Samples.Timers
@ -11,7 +13,9 @@ namespace Elsa.Samples.Timers
public void Build(IWorkflowBuilder builder)
{
builder
.TimerEvent(Duration.FromSeconds(5))
.WithPersistenceBehavior(WorkflowPersistenceBehavior.ActivityExecuted)
.TimerEvent(Duration.FromSeconds(1))
.WriteLine(new CodeExpression<string>("Hello World"))
.WriteLine(() => $"Timer event at {DateTime.Now}");
}
}