diff --git a/Elsa.sln b/Elsa.sln index 75bd715a4..df5724d86 100644 --- a/Elsa.sln +++ b/Elsa.sln @@ -1,484 +1,381 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.29509.3 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Core", "src\core\Elsa.Core\Elsa.Core.csproj", "{300EE2D5-54C5-46F2-AD03-BB43589EA074}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{DA71CDAA-8DD3-4D5F-9FBD-8E4B37A2D925}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "solution", "solution", "{7165BB9E-F22C-40D2-B7B1-CA3EFA2529A0}" - ProjectSection(SolutionItems) = preProject - .dockerignore = .dockerignore - .editorconfig = .editorconfig - .gitignore = .gitignore - docker-compose.yaml = docker-compose.yaml - Dockerfile = Dockerfile - Nuget.Config = Nuget.Config - README.md = README.md - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Abstractions", "src\core\Elsa.Abstractions\Elsa.Abstractions.csproj", "{3130C574-557C-4DA2-933E-AED7A9EBE48A}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "core", "core", "{35F44BE9-13D0-417C-A01A-F0787BEE6DC3}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Activities.Console", "src\activities\Elsa.Activities.Console\Elsa.Activities.Console.csproj", "{B98B80CB-D3A3-437C-A61C-ED82C8C77B2F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Activities.Http", "src\activities\Elsa.Activities.Http\Elsa.Activities.Http.csproj", "{1D63E1B4-2386-4BEC-9090-C3F3CBF25703}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "activities", "activities", "{B43B546E-23F3-46E8-ACB7-D04F05CDA180}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Activities.Email", "src\activities\Elsa.Activities.Email\Elsa.Activities.Email.csproj", "{D20FCB88-9DCA-49EA-9CC2-5B94DD935D30}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Activities.Timers", "src\activities\Elsa.Activities.Timers\Elsa.Activities.Timers.csproj", "{E4B71DC4-3E73-49C3-9B4E-CA13909F222D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Activities.MassTransit", "src\activities\Elsa.Activities.MassTransit\Elsa.Activities.MassTransit.csproj", "{C4939482-9447-47D1-B6AF-E9F8C6323841}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{5E5E1E84-DDBC-40D6-B891-0D563A15A44A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Activities.UserTask", "src\activities\Elsa.Activities.UserTask\Elsa.Activities.UserTask.csproj", "{823F80B6-E241-43F7-83BD-29FBB58A77F9}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Activities.Dropbox", "src\activities\Elsa.Activities.Dropbox\Elsa.Activities.Dropbox.csproj", "{79E85459-EF54-44D6-9508-1E68B8238D00}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "scripting", "scripting", "{9C3C685E-3D7D-4638-A031-24F71CF74B52}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa", "src\core\Elsa\Elsa.csproj", "{6BB5EB72-AD9A-41ED-A6AA-0FF1093EA41B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Scripting.JavaScript", "src\scripting\Elsa.Scripting.JavaScript\Elsa.Scripting.JavaScript.csproj", "{18BE8F72-E528-4617-B1B1-07BD35337DFC}" -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}") = "server", "server", "{468E498C-59DB-4541-8D8A-0D89DE9083AB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Server.Host", "src\server\Elsa.Server.Host\Elsa.Server.Host.csproj", "{FC54EDBA-71FB-4A87-8FD5-54759DF77CCE}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{AB1AE008-6FD6-414C-8E88-D735F42E1FA6}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "integration", "integration", "{0A3C36AB-2ACF-4175-A512-66B4C3DB9371}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "shared", "shared", "{0A6747EA-7AC6-4B6F-BC0C-C40C8A80C44D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Testing.Shared", "test\shared\Elsa.Testing.Shared\Elsa.Testing.Shared.csproj", "{E7C689EB-5AD6-4E91-A007-6116EEA702FC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.DistributedLocking.SqlServer", "src\providers\Elsa.DistributedLocking.SqlServer\Elsa.DistributedLocking.SqlServer.csproj", "{150EF356-E8BC-4922-91C2-362017479409}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.DistributedLocking.Redis", "src\providers\Elsa.DistributedLocking.Redis\Elsa.DistributedLocking.Redis.csproj", "{EBD49CCA-5400-4C36-B5DF-7B28190AA323}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.DistributedLocking.AzureBlob", "src\providers\Elsa.DistributedLocking.AzureBlob\Elsa.DistributedLocking.AzureBlob.csproj", "{E20238CE-5C64-4F87-8753-3B4E1EC9A740}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "locking", "locking", "{7CD5C8D5-EC78-4A99-A514-F01CA7197AC8}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Core.IntegrationTests", "test\integration\Elsa.Core.IntegrationTests\Elsa.Core.IntegrationTests.csproj", "{4CB34AB3-01C9-4911-8914-EABAA744EAD3}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "component", "component", "{FC47A50F-03B2-47D8-AAFB-075314FBA186}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.ComponentTests", "test\component\Elsa.ComponentTests\Elsa.ComponentTests.csproj", "{BB5819C7-434A-4AC5-8B0E-6C4FA672EBD5}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Server.Api", "src\server\Elsa.Server.Api\Elsa.Server.Api.csproj", "{44E0B699-A140-4551-A0E9-9FD9F171A9C2}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "clients", "clients", "{E43FB9E7-7851-4880-B7EE-12B8CEE628D0}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Client", "src\clients\Elsa.Client\Elsa.Client.csproj", "{2DA042D6-1E3C-4B15-B48E-BF45426C74E1}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dashboards", "dashboards", "{5583B236-794A-422C-B306-52BB7DFE7EBE}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "blazor", "blazor", "{5837821B-CA71-40B6-A9F1-C25D318B4691}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ElsaDashboard.Backend", "src\dashboards\blazor\ElsaDashboard.Backend\ElsaDashboard.Backend.csproj", "{25015984-7F81-454C-AC6E-E6DC810A59E2}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ElsaDashboard.Shared", "src\dashboards\blazor\ElsaDashboard.Shared\ElsaDashboard.Shared.csproj", "{DC9B6EEA-E692-4AF7-9A5A-870FAC4B5EB2}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ElsaDashboard.WebAssembly", "src\dashboards\blazor\ElsaDashboard.WebAssembly\ElsaDashboard.WebAssembly.csproj", "{04FD384F-1B78-4D4C-9815-F9FBDA1B9245}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ElsaDashboard.Application", "src\dashboards\blazor\ElsaDashboard.Application\ElsaDashboard.Application.csproj", "{EDD20103-2089-48D7-A445-6FA8183CA376}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ElsaDashboard.Application.Server", "src\dashboards\blazor\ElsaDashboard.Application.Server\ElsaDashboard.Application.Server.csproj", "{8DD4F1E8-8AC8-4AB4-AC08-9456AA6EAF10}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ElsaDashboard.Application.WebAssembly", "src\dashboards\blazor\ElsaDashboard.Application.WebAssembly\ElsaDashboard.Application.WebAssembly.csproj", "{F7181887-E6B5-4DA9-9598-8E9E806B5A20}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Activities.Rebus", "src\activities\Elsa.Activities.Rebus\Elsa.Activities.Rebus.csproj", "{115DEB38-679F-467E-8F87-9E669DFD2EB8}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "servicebus", "servicebus", "{47EDFC14-BB99-44BF-A447-035D40D7347B}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Rebus.AzureServiceBus", "src\servicebus\Elsa.Rebus.AzureServiceBus\Elsa.Rebus.AzureServiceBus.csproj", "{D3440E66-A871-4AB0-A1E0-8B3864ACA16A}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Rebus.RabbitMq", "src\servicebus\Elsa.Rebus.RabbitMq\Elsa.Rebus.RabbitMq.csproj", "{FC656D28-1AA3-462D-9B18-A10436E47C08}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Activities.AzureServiceBus", "src\activities\Elsa.Activities.AzureServiceBus\Elsa.Activities.AzureServiceBus.csproj", "{DD607BC1-F9D9-4685-BC8F-A4056C2C31FA}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "worker", "worker", "{E42743A0-FBDD-4150-9D53-6000496D9B87}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "console", "console", "{FC9F520F-BA51-4AD2-BFEE-EF787798E734}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "aspnet", "aspnet", "{22E75696-6FE9-436A-9097-EE21C603F818}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.ContextualWorkflowHttp", "src\samples\aspnet\Elsa.Samples.ContextualWorkflowHttp\Elsa.Samples.ContextualWorkflowHttp.csproj", "{2EC02600-8367-4B25-8243-CA4E53FA00FA}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.CorrelationHttp", "src\samples\aspnet\Elsa.Samples.CorrelationHttp\Elsa.Samples.CorrelationHttp.csproj", "{3BDA353A-660E-47FA-95F5-4F6BB8E6B8AD}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.CustomActivities", "src\samples\aspnet\Elsa.Samples.CustomActivities\Elsa.Samples.CustomActivities.csproj", "{AC6AA60A-393F-4D49-B3F1-44F567B18E22}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.ForkJoinTimerAndSignalHttp", "src\samples\aspnet\Elsa.Samples.ForkJoinTimerAndSignalHttp\Elsa.Samples.ForkJoinTimerAndSignalHttp.csproj", "{8BB1B34D-E0FC-4804-9098-E7F8E35A749A}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.HelloWorldHttp", "src\samples\aspnet\Elsa.Samples.HelloWorldHttp\Elsa.Samples.HelloWorldHttp.csproj", "{15FDEF59-32F8-4F8F-AE10-B3D0FEE03049}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.ReadModelHttp", "src\samples\aspnet\Elsa.Samples.ReadModelHttp\Elsa.Samples.ReadModelHttp.csproj", "{795FF94C-F22C-45A3-9643-88EED173D6D4}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.DeclarativeCompositeActivitiesConsole", "src\samples\console\Elsa.Samples.DeclarativeCompositeActivitiesConsole\Elsa.Samples.DeclarativeCompositeActivitiesConsole.csproj", "{7EC9B4E1-820E-4D53-B4E2-9815E31C7AE8}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.FileBasedWorkflow", "src\samples\console\Elsa.Samples.FileBasedWorkflow\Elsa.Samples.FileBasedWorkflow.csproj", "{C6A54F89-271D-402E-A38D-6C3A9DB7DF9C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.ForLoopConsole", "src\samples\console\Elsa.Samples.ForLoopConsole\Elsa.Samples.ForLoopConsole.csproj", "{F5124847-D046-4458-A89D-CD796FEDEE1A}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.GoBackConsole", "src\samples\console\Elsa.Samples.GoBackConsole\Elsa.Samples.GoBackConsole.csproj", "{0B147307-64FF-4496-9DC9-8F83013AC045}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.HelloWorldConsole", "src\samples\console\Elsa.Samples.HelloWorldConsole\Elsa.Samples.HelloWorldConsole.csproj", "{935888CF-E871-42BB-A47D-5E1168269A03}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.IfElseConsole", "src\samples\console\Elsa.Samples.IfElseConsole\Elsa.Samples.IfElseConsole.csproj", "{EA1D7E39-D77D-4B13-BAD0-76BA30547019}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.ProgrammaticCompositeActivitiesConsole", "src\samples\console\Elsa.Samples.ProgrammaticCompositeActivitiesConsole\Elsa.Samples.ProgrammaticCompositeActivitiesConsole.csproj", "{0FC36CEC-35B3-4EB7-9DD7-0F2A1C4E9313}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.ReadLineEchoConsole", "src\samples\console\Elsa.Samples.ReadLineEchoConsole\Elsa.Samples.ReadLineEchoConsole.csproj", "{E7BAECCC-CBF8-4975-93C4-6D3A8F94B000}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.Serialization", "src\samples\console\Elsa.Samples.Serialization\Elsa.Samples.Serialization.csproj", "{823EB953-0B26-4D85-9B3F-14FCB476E987}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.SignalingConsole", "src\samples\console\Elsa.Samples.SignalingConsole\Elsa.Samples.SignalingConsole.csproj", "{83929B86-434B-4C24-9B02-1F944DF8D71C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.WhileLoopConsole", "src\samples\console\Elsa.Samples.WhileLoopConsole\Elsa.Samples.WhileLoopConsole.csproj", "{EDE80D8C-4C1F-44A3-8D0E-6D0757439E1C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.AzureServiceBusWorker", "src\samples\worker\Elsa.Samples.AzureServiceBusWorker\Elsa.Samples.AzureServiceBusWorker.csproj", "{F958B682-5192-4287-BF80-CB7B30ECFC9E}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.DistributedLock", "src\samples\worker\Elsa.Samples.DistributedLock\Elsa.Samples.DistributedLock.csproj", "{F081EE15-7E1A-4E8C-B91F-5472ED565431}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.MultiTenantChildWorker", "src\samples\worker\Elsa.Samples.MultiTenantChildWorker\Elsa.Samples.MultiTenantChildWorker.csproj", "{1053BF2D-BCB6-4616-9773-7FF25F48ECA3}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.RebusWorker", "src\samples\worker\Elsa.Samples.RebusWorker\Elsa.Samples.RebusWorker.csproj", "{6837DB22-1F5C-42E1-A466-E4597AF6E91E}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.RunChildWorkflowWorker", "src\samples\worker\Elsa.Samples.RunChildWorkflowWorker\Elsa.Samples.RunChildWorkflowWorker.csproj", "{A4DF29BD-95CC-4A86-96EC-FB6692270E68}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.Timers", "src\samples\worker\Elsa.Samples.Timers\Elsa.Samples.Timers.csproj", "{FD2D1BD0-1229-4DCF-BE70-6BFD396DD489}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.WhileLoopWorker", "src\samples\worker\Elsa.Samples.WhileLoopWorker\Elsa.Samples.WhileLoopWorker.csproj", "{EA3832C4-8079-4E84-AF8C-12744E4EFD44}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.CustomAttributesChildWorker", "src\samples\worker\Elsa.Samples.CustomAttributesChildWorker\Elsa.Samples.CustomAttributesChildWorker.csproj", "{AEA00027-F280-43A4-AC60-E2AF3014CF34}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.Interrupts", "src\samples\aspnet\Elsa.Samples.Interrupts\Elsa.Samples.Interrupts.csproj", "{E0090EF3-C4A7-4262-9300-1D395BE25DD0}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {300EE2D5-54C5-46F2-AD03-BB43589EA074}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {300EE2D5-54C5-46F2-AD03-BB43589EA074}.Debug|Any CPU.Build.0 = Debug|Any CPU - {300EE2D5-54C5-46F2-AD03-BB43589EA074}.Release|Any CPU.ActiveCfg = Release|Any CPU - {300EE2D5-54C5-46F2-AD03-BB43589EA074}.Release|Any CPU.Build.0 = Release|Any CPU - {3130C574-557C-4DA2-933E-AED7A9EBE48A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3130C574-557C-4DA2-933E-AED7A9EBE48A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3130C574-557C-4DA2-933E-AED7A9EBE48A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3130C574-557C-4DA2-933E-AED7A9EBE48A}.Release|Any CPU.Build.0 = Release|Any CPU - {B98B80CB-D3A3-437C-A61C-ED82C8C77B2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B98B80CB-D3A3-437C-A61C-ED82C8C77B2F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B98B80CB-D3A3-437C-A61C-ED82C8C77B2F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B98B80CB-D3A3-437C-A61C-ED82C8C77B2F}.Release|Any CPU.Build.0 = Release|Any CPU - {1D63E1B4-2386-4BEC-9090-C3F3CBF25703}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1D63E1B4-2386-4BEC-9090-C3F3CBF25703}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1D63E1B4-2386-4BEC-9090-C3F3CBF25703}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1D63E1B4-2386-4BEC-9090-C3F3CBF25703}.Release|Any CPU.Build.0 = Release|Any CPU - {D20FCB88-9DCA-49EA-9CC2-5B94DD935D30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D20FCB88-9DCA-49EA-9CC2-5B94DD935D30}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D20FCB88-9DCA-49EA-9CC2-5B94DD935D30}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D20FCB88-9DCA-49EA-9CC2-5B94DD935D30}.Release|Any CPU.Build.0 = Release|Any CPU - {E4B71DC4-3E73-49C3-9B4E-CA13909F222D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E4B71DC4-3E73-49C3-9B4E-CA13909F222D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E4B71DC4-3E73-49C3-9B4E-CA13909F222D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E4B71DC4-3E73-49C3-9B4E-CA13909F222D}.Release|Any CPU.Build.0 = Release|Any CPU - {C4939482-9447-47D1-B6AF-E9F8C6323841}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C4939482-9447-47D1-B6AF-E9F8C6323841}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C4939482-9447-47D1-B6AF-E9F8C6323841}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C4939482-9447-47D1-B6AF-E9F8C6323841}.Release|Any CPU.Build.0 = Release|Any CPU - {823F80B6-E241-43F7-83BD-29FBB58A77F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {823F80B6-E241-43F7-83BD-29FBB58A77F9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {823F80B6-E241-43F7-83BD-29FBB58A77F9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {823F80B6-E241-43F7-83BD-29FBB58A77F9}.Release|Any CPU.Build.0 = Release|Any CPU - {79E85459-EF54-44D6-9508-1E68B8238D00}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {79E85459-EF54-44D6-9508-1E68B8238D00}.Debug|Any CPU.Build.0 = Debug|Any CPU - {79E85459-EF54-44D6-9508-1E68B8238D00}.Release|Any CPU.ActiveCfg = Release|Any CPU - {79E85459-EF54-44D6-9508-1E68B8238D00}.Release|Any CPU.Build.0 = Release|Any CPU - {6BB5EB72-AD9A-41ED-A6AA-0FF1093EA41B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6BB5EB72-AD9A-41ED-A6AA-0FF1093EA41B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6BB5EB72-AD9A-41ED-A6AA-0FF1093EA41B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6BB5EB72-AD9A-41ED-A6AA-0FF1093EA41B}.Release|Any CPU.Build.0 = Release|Any CPU - {18BE8F72-E528-4617-B1B1-07BD35337DFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {18BE8F72-E528-4617-B1B1-07BD35337DFC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {18BE8F72-E528-4617-B1B1-07BD35337DFC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {18BE8F72-E528-4617-B1B1-07BD35337DFC}.Release|Any CPU.Build.0 = Release|Any CPU - {01DC21DD-C6E2-4B21-864E-97D29448F777}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {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 - {FC54EDBA-71FB-4A87-8FD5-54759DF77CCE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FC54EDBA-71FB-4A87-8FD5-54759DF77CCE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FC54EDBA-71FB-4A87-8FD5-54759DF77CCE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FC54EDBA-71FB-4A87-8FD5-54759DF77CCE}.Release|Any CPU.Build.0 = Release|Any CPU - {E7C689EB-5AD6-4E91-A007-6116EEA702FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E7C689EB-5AD6-4E91-A007-6116EEA702FC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E7C689EB-5AD6-4E91-A007-6116EEA702FC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E7C689EB-5AD6-4E91-A007-6116EEA702FC}.Release|Any CPU.Build.0 = Release|Any CPU - {150EF356-E8BC-4922-91C2-362017479409}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {150EF356-E8BC-4922-91C2-362017479409}.Debug|Any CPU.Build.0 = Debug|Any CPU - {150EF356-E8BC-4922-91C2-362017479409}.Release|Any CPU.ActiveCfg = Release|Any CPU - {150EF356-E8BC-4922-91C2-362017479409}.Release|Any CPU.Build.0 = Release|Any CPU - {EBD49CCA-5400-4C36-B5DF-7B28190AA323}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EBD49CCA-5400-4C36-B5DF-7B28190AA323}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EBD49CCA-5400-4C36-B5DF-7B28190AA323}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EBD49CCA-5400-4C36-B5DF-7B28190AA323}.Release|Any CPU.Build.0 = Release|Any CPU - {E20238CE-5C64-4F87-8753-3B4E1EC9A740}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E20238CE-5C64-4F87-8753-3B4E1EC9A740}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E20238CE-5C64-4F87-8753-3B4E1EC9A740}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E20238CE-5C64-4F87-8753-3B4E1EC9A740}.Release|Any CPU.Build.0 = Release|Any CPU - - {4CB34AB3-01C9-4911-8914-EABAA744EAD3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4CB34AB3-01C9-4911-8914-EABAA744EAD3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4CB34AB3-01C9-4911-8914-EABAA744EAD3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4CB34AB3-01C9-4911-8914-EABAA744EAD3}.Release|Any CPU.Build.0 = Release|Any CPU - {BB5819C7-434A-4AC5-8B0E-6C4FA672EBD5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BB5819C7-434A-4AC5-8B0E-6C4FA672EBD5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BB5819C7-434A-4AC5-8B0E-6C4FA672EBD5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BB5819C7-434A-4AC5-8B0E-6C4FA672EBD5}.Release|Any CPU.Build.0 = Release|Any CPU - {44E0B699-A140-4551-A0E9-9FD9F171A9C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {44E0B699-A140-4551-A0E9-9FD9F171A9C2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {44E0B699-A140-4551-A0E9-9FD9F171A9C2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {44E0B699-A140-4551-A0E9-9FD9F171A9C2}.Release|Any CPU.Build.0 = Release|Any CPU - {2DA042D6-1E3C-4B15-B48E-BF45426C74E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2DA042D6-1E3C-4B15-B48E-BF45426C74E1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2DA042D6-1E3C-4B15-B48E-BF45426C74E1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2DA042D6-1E3C-4B15-B48E-BF45426C74E1}.Release|Any CPU.Build.0 = Release|Any CPU - {25015984-7F81-454C-AC6E-E6DC810A59E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {25015984-7F81-454C-AC6E-E6DC810A59E2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {25015984-7F81-454C-AC6E-E6DC810A59E2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {25015984-7F81-454C-AC6E-E6DC810A59E2}.Release|Any CPU.Build.0 = Release|Any CPU - {DC9B6EEA-E692-4AF7-9A5A-870FAC4B5EB2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DC9B6EEA-E692-4AF7-9A5A-870FAC4B5EB2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DC9B6EEA-E692-4AF7-9A5A-870FAC4B5EB2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DC9B6EEA-E692-4AF7-9A5A-870FAC4B5EB2}.Release|Any CPU.Build.0 = Release|Any CPU - {04FD384F-1B78-4D4C-9815-F9FBDA1B9245}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {04FD384F-1B78-4D4C-9815-F9FBDA1B9245}.Debug|Any CPU.Build.0 = Debug|Any CPU - {04FD384F-1B78-4D4C-9815-F9FBDA1B9245}.Release|Any CPU.ActiveCfg = Release|Any CPU - {04FD384F-1B78-4D4C-9815-F9FBDA1B9245}.Release|Any CPU.Build.0 = Release|Any CPU - {EDD20103-2089-48D7-A445-6FA8183CA376}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EDD20103-2089-48D7-A445-6FA8183CA376}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EDD20103-2089-48D7-A445-6FA8183CA376}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EDD20103-2089-48D7-A445-6FA8183CA376}.Release|Any CPU.Build.0 = Release|Any CPU - {8DD4F1E8-8AC8-4AB4-AC08-9456AA6EAF10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8DD4F1E8-8AC8-4AB4-AC08-9456AA6EAF10}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8DD4F1E8-8AC8-4AB4-AC08-9456AA6EAF10}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8DD4F1E8-8AC8-4AB4-AC08-9456AA6EAF10}.Release|Any CPU.Build.0 = Release|Any CPU - {F7181887-E6B5-4DA9-9598-8E9E806B5A20}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F7181887-E6B5-4DA9-9598-8E9E806B5A20}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F7181887-E6B5-4DA9-9598-8E9E806B5A20}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F7181887-E6B5-4DA9-9598-8E9E806B5A20}.Release|Any CPU.Build.0 = Release|Any CPU - {115DEB38-679F-467E-8F87-9E669DFD2EB8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {115DEB38-679F-467E-8F87-9E669DFD2EB8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {115DEB38-679F-467E-8F87-9E669DFD2EB8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {115DEB38-679F-467E-8F87-9E669DFD2EB8}.Release|Any CPU.Build.0 = Release|Any CPU - {D3440E66-A871-4AB0-A1E0-8B3864ACA16A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D3440E66-A871-4AB0-A1E0-8B3864ACA16A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D3440E66-A871-4AB0-A1E0-8B3864ACA16A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D3440E66-A871-4AB0-A1E0-8B3864ACA16A}.Release|Any CPU.Build.0 = Release|Any CPU - {FC656D28-1AA3-462D-9B18-A10436E47C08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FC656D28-1AA3-462D-9B18-A10436E47C08}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FC656D28-1AA3-462D-9B18-A10436E47C08}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FC656D28-1AA3-462D-9B18-A10436E47C08}.Release|Any CPU.Build.0 = Release|Any CPU - {DD607BC1-F9D9-4685-BC8F-A4056C2C31FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DD607BC1-F9D9-4685-BC8F-A4056C2C31FA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DD607BC1-F9D9-4685-BC8F-A4056C2C31FA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DD607BC1-F9D9-4685-BC8F-A4056C2C31FA}.Release|Any CPU.Build.0 = Release|Any CPU - {2EC02600-8367-4B25-8243-CA4E53FA00FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2EC02600-8367-4B25-8243-CA4E53FA00FA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2EC02600-8367-4B25-8243-CA4E53FA00FA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2EC02600-8367-4B25-8243-CA4E53FA00FA}.Release|Any CPU.Build.0 = Release|Any CPU - {3BDA353A-660E-47FA-95F5-4F6BB8E6B8AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3BDA353A-660E-47FA-95F5-4F6BB8E6B8AD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3BDA353A-660E-47FA-95F5-4F6BB8E6B8AD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3BDA353A-660E-47FA-95F5-4F6BB8E6B8AD}.Release|Any CPU.Build.0 = Release|Any CPU - {AC6AA60A-393F-4D49-B3F1-44F567B18E22}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AC6AA60A-393F-4D49-B3F1-44F567B18E22}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AC6AA60A-393F-4D49-B3F1-44F567B18E22}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AC6AA60A-393F-4D49-B3F1-44F567B18E22}.Release|Any CPU.Build.0 = Release|Any CPU - {8BB1B34D-E0FC-4804-9098-E7F8E35A749A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8BB1B34D-E0FC-4804-9098-E7F8E35A749A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8BB1B34D-E0FC-4804-9098-E7F8E35A749A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8BB1B34D-E0FC-4804-9098-E7F8E35A749A}.Release|Any CPU.Build.0 = Release|Any CPU - {15FDEF59-32F8-4F8F-AE10-B3D0FEE03049}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {15FDEF59-32F8-4F8F-AE10-B3D0FEE03049}.Debug|Any CPU.Build.0 = Debug|Any CPU - {15FDEF59-32F8-4F8F-AE10-B3D0FEE03049}.Release|Any CPU.ActiveCfg = Release|Any CPU - {15FDEF59-32F8-4F8F-AE10-B3D0FEE03049}.Release|Any CPU.Build.0 = Release|Any CPU - {795FF94C-F22C-45A3-9643-88EED173D6D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {795FF94C-F22C-45A3-9643-88EED173D6D4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {795FF94C-F22C-45A3-9643-88EED173D6D4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {795FF94C-F22C-45A3-9643-88EED173D6D4}.Release|Any CPU.Build.0 = Release|Any CPU - {7EC9B4E1-820E-4D53-B4E2-9815E31C7AE8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7EC9B4E1-820E-4D53-B4E2-9815E31C7AE8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7EC9B4E1-820E-4D53-B4E2-9815E31C7AE8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7EC9B4E1-820E-4D53-B4E2-9815E31C7AE8}.Release|Any CPU.Build.0 = Release|Any CPU - {C6A54F89-271D-402E-A38D-6C3A9DB7DF9C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C6A54F89-271D-402E-A38D-6C3A9DB7DF9C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C6A54F89-271D-402E-A38D-6C3A9DB7DF9C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C6A54F89-271D-402E-A38D-6C3A9DB7DF9C}.Release|Any CPU.Build.0 = Release|Any CPU - {F5124847-D046-4458-A89D-CD796FEDEE1A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F5124847-D046-4458-A89D-CD796FEDEE1A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F5124847-D046-4458-A89D-CD796FEDEE1A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F5124847-D046-4458-A89D-CD796FEDEE1A}.Release|Any CPU.Build.0 = Release|Any CPU - {0B147307-64FF-4496-9DC9-8F83013AC045}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0B147307-64FF-4496-9DC9-8F83013AC045}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0B147307-64FF-4496-9DC9-8F83013AC045}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0B147307-64FF-4496-9DC9-8F83013AC045}.Release|Any CPU.Build.0 = Release|Any CPU - {935888CF-E871-42BB-A47D-5E1168269A03}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {935888CF-E871-42BB-A47D-5E1168269A03}.Debug|Any CPU.Build.0 = Debug|Any CPU - {935888CF-E871-42BB-A47D-5E1168269A03}.Release|Any CPU.ActiveCfg = Release|Any CPU - {935888CF-E871-42BB-A47D-5E1168269A03}.Release|Any CPU.Build.0 = Release|Any CPU - {EA1D7E39-D77D-4B13-BAD0-76BA30547019}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EA1D7E39-D77D-4B13-BAD0-76BA30547019}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EA1D7E39-D77D-4B13-BAD0-76BA30547019}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EA1D7E39-D77D-4B13-BAD0-76BA30547019}.Release|Any CPU.Build.0 = Release|Any CPU - {0FC36CEC-35B3-4EB7-9DD7-0F2A1C4E9313}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0FC36CEC-35B3-4EB7-9DD7-0F2A1C4E9313}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0FC36CEC-35B3-4EB7-9DD7-0F2A1C4E9313}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0FC36CEC-35B3-4EB7-9DD7-0F2A1C4E9313}.Release|Any CPU.Build.0 = Release|Any CPU - {E7BAECCC-CBF8-4975-93C4-6D3A8F94B000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E7BAECCC-CBF8-4975-93C4-6D3A8F94B000}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E7BAECCC-CBF8-4975-93C4-6D3A8F94B000}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E7BAECCC-CBF8-4975-93C4-6D3A8F94B000}.Release|Any CPU.Build.0 = Release|Any CPU - {823EB953-0B26-4D85-9B3F-14FCB476E987}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {823EB953-0B26-4D85-9B3F-14FCB476E987}.Debug|Any CPU.Build.0 = Debug|Any CPU - {823EB953-0B26-4D85-9B3F-14FCB476E987}.Release|Any CPU.ActiveCfg = Release|Any CPU - {823EB953-0B26-4D85-9B3F-14FCB476E987}.Release|Any CPU.Build.0 = Release|Any CPU - {83929B86-434B-4C24-9B02-1F944DF8D71C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {83929B86-434B-4C24-9B02-1F944DF8D71C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {83929B86-434B-4C24-9B02-1F944DF8D71C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {83929B86-434B-4C24-9B02-1F944DF8D71C}.Release|Any CPU.Build.0 = Release|Any CPU - {EDE80D8C-4C1F-44A3-8D0E-6D0757439E1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EDE80D8C-4C1F-44A3-8D0E-6D0757439E1C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EDE80D8C-4C1F-44A3-8D0E-6D0757439E1C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EDE80D8C-4C1F-44A3-8D0E-6D0757439E1C}.Release|Any CPU.Build.0 = Release|Any CPU - {F958B682-5192-4287-BF80-CB7B30ECFC9E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F958B682-5192-4287-BF80-CB7B30ECFC9E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F958B682-5192-4287-BF80-CB7B30ECFC9E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F958B682-5192-4287-BF80-CB7B30ECFC9E}.Release|Any CPU.Build.0 = Release|Any CPU - {F081EE15-7E1A-4E8C-B91F-5472ED565431}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F081EE15-7E1A-4E8C-B91F-5472ED565431}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F081EE15-7E1A-4E8C-B91F-5472ED565431}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F081EE15-7E1A-4E8C-B91F-5472ED565431}.Release|Any CPU.Build.0 = Release|Any CPU - {1053BF2D-BCB6-4616-9773-7FF25F48ECA3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1053BF2D-BCB6-4616-9773-7FF25F48ECA3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1053BF2D-BCB6-4616-9773-7FF25F48ECA3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1053BF2D-BCB6-4616-9773-7FF25F48ECA3}.Release|Any CPU.Build.0 = Release|Any CPU - {6837DB22-1F5C-42E1-A466-E4597AF6E91E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6837DB22-1F5C-42E1-A466-E4597AF6E91E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6837DB22-1F5C-42E1-A466-E4597AF6E91E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6837DB22-1F5C-42E1-A466-E4597AF6E91E}.Release|Any CPU.Build.0 = Release|Any CPU - {A4DF29BD-95CC-4A86-96EC-FB6692270E68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A4DF29BD-95CC-4A86-96EC-FB6692270E68}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A4DF29BD-95CC-4A86-96EC-FB6692270E68}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A4DF29BD-95CC-4A86-96EC-FB6692270E68}.Release|Any CPU.Build.0 = Release|Any CPU - {FD2D1BD0-1229-4DCF-BE70-6BFD396DD489}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FD2D1BD0-1229-4DCF-BE70-6BFD396DD489}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FD2D1BD0-1229-4DCF-BE70-6BFD396DD489}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FD2D1BD0-1229-4DCF-BE70-6BFD396DD489}.Release|Any CPU.Build.0 = Release|Any CPU - {EA3832C4-8079-4E84-AF8C-12744E4EFD44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EA3832C4-8079-4E84-AF8C-12744E4EFD44}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EA3832C4-8079-4E84-AF8C-12744E4EFD44}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EA3832C4-8079-4E84-AF8C-12744E4EFD44}.Release|Any CPU.Build.0 = Release|Any CPU - {AEA00027-F280-43A4-AC60-E2AF3014CF34}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AEA00027-F280-43A4-AC60-E2AF3014CF34}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AEA00027-F280-43A4-AC60-E2AF3014CF34}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AEA00027-F280-43A4-AC60-E2AF3014CF34}.Release|Any CPU.Build.0 = Release|Any CPU - {E0090EF3-C4A7-4262-9300-1D395BE25DD0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E0090EF3-C4A7-4262-9300-1D395BE25DD0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E0090EF3-C4A7-4262-9300-1D395BE25DD0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E0090EF3-C4A7-4262-9300-1D395BE25DD0}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {300EE2D5-54C5-46F2-AD03-BB43589EA074} = {35F44BE9-13D0-417C-A01A-F0787BEE6DC3} - {3130C574-557C-4DA2-933E-AED7A9EBE48A} = {35F44BE9-13D0-417C-A01A-F0787BEE6DC3} - {35F44BE9-13D0-417C-A01A-F0787BEE6DC3} = {DA71CDAA-8DD3-4D5F-9FBD-8E4B37A2D925} - {B98B80CB-D3A3-437C-A61C-ED82C8C77B2F} = {B43B546E-23F3-46E8-ACB7-D04F05CDA180} - {1D63E1B4-2386-4BEC-9090-C3F3CBF25703} = {B43B546E-23F3-46E8-ACB7-D04F05CDA180} - {B43B546E-23F3-46E8-ACB7-D04F05CDA180} = {DA71CDAA-8DD3-4D5F-9FBD-8E4B37A2D925} - {D20FCB88-9DCA-49EA-9CC2-5B94DD935D30} = {B43B546E-23F3-46E8-ACB7-D04F05CDA180} - {E4B71DC4-3E73-49C3-9B4E-CA13909F222D} = {B43B546E-23F3-46E8-ACB7-D04F05CDA180} - {C4939482-9447-47D1-B6AF-E9F8C6323841} = {B43B546E-23F3-46E8-ACB7-D04F05CDA180} - {5E5E1E84-DDBC-40D6-B891-0D563A15A44A} = {DA71CDAA-8DD3-4D5F-9FBD-8E4B37A2D925} - {823F80B6-E241-43F7-83BD-29FBB58A77F9} = {B43B546E-23F3-46E8-ACB7-D04F05CDA180} - {79E85459-EF54-44D6-9508-1E68B8238D00} = {B43B546E-23F3-46E8-ACB7-D04F05CDA180} - {9C3C685E-3D7D-4638-A031-24F71CF74B52} = {DA71CDAA-8DD3-4D5F-9FBD-8E4B37A2D925} - {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} - {468E498C-59DB-4541-8D8A-0D89DE9083AB} = {DA71CDAA-8DD3-4D5F-9FBD-8E4B37A2D925} - {FC54EDBA-71FB-4A87-8FD5-54759DF77CCE} = {468E498C-59DB-4541-8D8A-0D89DE9083AB} - {0A3C36AB-2ACF-4175-A512-66B4C3DB9371} = {AB1AE008-6FD6-414C-8E88-D735F42E1FA6} - {0A6747EA-7AC6-4B6F-BC0C-C40C8A80C44D} = {AB1AE008-6FD6-414C-8E88-D735F42E1FA6} - {E7C689EB-5AD6-4E91-A007-6116EEA702FC} = {0A6747EA-7AC6-4B6F-BC0C-C40C8A80C44D} - {7CD5C8D5-EC78-4A99-A514-F01CA7197AC8} = {DA71CDAA-8DD3-4D5F-9FBD-8E4B37A2D925} - {E20238CE-5C64-4F87-8753-3B4E1EC9A740} = {7CD5C8D5-EC78-4A99-A514-F01CA7197AC8} - {EBD49CCA-5400-4C36-B5DF-7B28190AA323} = {7CD5C8D5-EC78-4A99-A514-F01CA7197AC8} - {150EF356-E8BC-4922-91C2-362017479409} = {7CD5C8D5-EC78-4A99-A514-F01CA7197AC8} - {4CB34AB3-01C9-4911-8914-EABAA744EAD3} = {0A3C36AB-2ACF-4175-A512-66B4C3DB9371} - {FC47A50F-03B2-47D8-AAFB-075314FBA186} = {AB1AE008-6FD6-414C-8E88-D735F42E1FA6} - {BB5819C7-434A-4AC5-8B0E-6C4FA672EBD5} = {FC47A50F-03B2-47D8-AAFB-075314FBA186} - {44E0B699-A140-4551-A0E9-9FD9F171A9C2} = {468E498C-59DB-4541-8D8A-0D89DE9083AB} - {E43FB9E7-7851-4880-B7EE-12B8CEE628D0} = {DA71CDAA-8DD3-4D5F-9FBD-8E4B37A2D925} - {2DA042D6-1E3C-4B15-B48E-BF45426C74E1} = {E43FB9E7-7851-4880-B7EE-12B8CEE628D0} - {5583B236-794A-422C-B306-52BB7DFE7EBE} = {DA71CDAA-8DD3-4D5F-9FBD-8E4B37A2D925} - {5837821B-CA71-40B6-A9F1-C25D318B4691} = {5583B236-794A-422C-B306-52BB7DFE7EBE} - {25015984-7F81-454C-AC6E-E6DC810A59E2} = {5837821B-CA71-40B6-A9F1-C25D318B4691} - {DC9B6EEA-E692-4AF7-9A5A-870FAC4B5EB2} = {5837821B-CA71-40B6-A9F1-C25D318B4691} - {04FD384F-1B78-4D4C-9815-F9FBDA1B9245} = {5837821B-CA71-40B6-A9F1-C25D318B4691} - {EDD20103-2089-48D7-A445-6FA8183CA376} = {5837821B-CA71-40B6-A9F1-C25D318B4691} - {8DD4F1E8-8AC8-4AB4-AC08-9456AA6EAF10} = {5837821B-CA71-40B6-A9F1-C25D318B4691} - {F7181887-E6B5-4DA9-9598-8E9E806B5A20} = {5837821B-CA71-40B6-A9F1-C25D318B4691} - {115DEB38-679F-467E-8F87-9E669DFD2EB8} = {B43B546E-23F3-46E8-ACB7-D04F05CDA180} - {47EDFC14-BB99-44BF-A447-035D40D7347B} = {DA71CDAA-8DD3-4D5F-9FBD-8E4B37A2D925} - {D3440E66-A871-4AB0-A1E0-8B3864ACA16A} = {47EDFC14-BB99-44BF-A447-035D40D7347B} - {FC656D28-1AA3-462D-9B18-A10436E47C08} = {47EDFC14-BB99-44BF-A447-035D40D7347B} - {DD607BC1-F9D9-4685-BC8F-A4056C2C31FA} = {B43B546E-23F3-46E8-ACB7-D04F05CDA180} - {E42743A0-FBDD-4150-9D53-6000496D9B87} = {5E5E1E84-DDBC-40D6-B891-0D563A15A44A} - {FC9F520F-BA51-4AD2-BFEE-EF787798E734} = {5E5E1E84-DDBC-40D6-B891-0D563A15A44A} - {22E75696-6FE9-436A-9097-EE21C603F818} = {5E5E1E84-DDBC-40D6-B891-0D563A15A44A} - {2EC02600-8367-4B25-8243-CA4E53FA00FA} = {22E75696-6FE9-436A-9097-EE21C603F818} - {3BDA353A-660E-47FA-95F5-4F6BB8E6B8AD} = {22E75696-6FE9-436A-9097-EE21C603F818} - {AC6AA60A-393F-4D49-B3F1-44F567B18E22} = {22E75696-6FE9-436A-9097-EE21C603F818} - {8BB1B34D-E0FC-4804-9098-E7F8E35A749A} = {22E75696-6FE9-436A-9097-EE21C603F818} - {15FDEF59-32F8-4F8F-AE10-B3D0FEE03049} = {22E75696-6FE9-436A-9097-EE21C603F818} - {795FF94C-F22C-45A3-9643-88EED173D6D4} = {22E75696-6FE9-436A-9097-EE21C603F818} - {7EC9B4E1-820E-4D53-B4E2-9815E31C7AE8} = {FC9F520F-BA51-4AD2-BFEE-EF787798E734} - {C6A54F89-271D-402E-A38D-6C3A9DB7DF9C} = {FC9F520F-BA51-4AD2-BFEE-EF787798E734} - {F5124847-D046-4458-A89D-CD796FEDEE1A} = {FC9F520F-BA51-4AD2-BFEE-EF787798E734} - {0B147307-64FF-4496-9DC9-8F83013AC045} = {FC9F520F-BA51-4AD2-BFEE-EF787798E734} - {935888CF-E871-42BB-A47D-5E1168269A03} = {FC9F520F-BA51-4AD2-BFEE-EF787798E734} - {EA1D7E39-D77D-4B13-BAD0-76BA30547019} = {FC9F520F-BA51-4AD2-BFEE-EF787798E734} - {0FC36CEC-35B3-4EB7-9DD7-0F2A1C4E9313} = {FC9F520F-BA51-4AD2-BFEE-EF787798E734} - {E7BAECCC-CBF8-4975-93C4-6D3A8F94B000} = {FC9F520F-BA51-4AD2-BFEE-EF787798E734} - {823EB953-0B26-4D85-9B3F-14FCB476E987} = {FC9F520F-BA51-4AD2-BFEE-EF787798E734} - {83929B86-434B-4C24-9B02-1F944DF8D71C} = {FC9F520F-BA51-4AD2-BFEE-EF787798E734} - {EDE80D8C-4C1F-44A3-8D0E-6D0757439E1C} = {FC9F520F-BA51-4AD2-BFEE-EF787798E734} - {F958B682-5192-4287-BF80-CB7B30ECFC9E} = {E42743A0-FBDD-4150-9D53-6000496D9B87} - {F081EE15-7E1A-4E8C-B91F-5472ED565431} = {E42743A0-FBDD-4150-9D53-6000496D9B87} - {1053BF2D-BCB6-4616-9773-7FF25F48ECA3} = {E42743A0-FBDD-4150-9D53-6000496D9B87} - {6837DB22-1F5C-42E1-A466-E4597AF6E91E} = {E42743A0-FBDD-4150-9D53-6000496D9B87} - {A4DF29BD-95CC-4A86-96EC-FB6692270E68} = {E42743A0-FBDD-4150-9D53-6000496D9B87} - {FD2D1BD0-1229-4DCF-BE70-6BFD396DD489} = {E42743A0-FBDD-4150-9D53-6000496D9B87} - {EA3832C4-8079-4E84-AF8C-12744E4EFD44} = {E42743A0-FBDD-4150-9D53-6000496D9B87} - {AEA00027-F280-43A4-AC60-E2AF3014CF34} = {E42743A0-FBDD-4150-9D53-6000496D9B87} - {E0090EF3-C4A7-4262-9300-1D395BE25DD0} = {22E75696-6FE9-436A-9097-EE21C603F818} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {8B0975FD-7050-48B0-88C5-48C33378E158} - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29509.3 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Core", "src\core\Elsa.Core\Elsa.Core.csproj", "{300EE2D5-54C5-46F2-AD03-BB43589EA074}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{DA71CDAA-8DD3-4D5F-9FBD-8E4B37A2D925}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "solution", "solution", "{7165BB9E-F22C-40D2-B7B1-CA3EFA2529A0}" + ProjectSection(SolutionItems) = preProject + .dockerignore = .dockerignore + .editorconfig = .editorconfig + .gitignore = .gitignore + docker-compose.yaml = docker-compose.yaml + Dockerfile = Dockerfile + Nuget.Config = Nuget.Config + README.md = README.md + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Abstractions", "src\core\Elsa.Abstractions\Elsa.Abstractions.csproj", "{3130C574-557C-4DA2-933E-AED7A9EBE48A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "core", "core", "{35F44BE9-13D0-417C-A01A-F0787BEE6DC3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Activities.Console", "src\activities\Elsa.Activities.Console\Elsa.Activities.Console.csproj", "{B98B80CB-D3A3-437C-A61C-ED82C8C77B2F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Activities.Http", "src\activities\Elsa.Activities.Http\Elsa.Activities.Http.csproj", "{1D63E1B4-2386-4BEC-9090-C3F3CBF25703}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "activities", "activities", "{B43B546E-23F3-46E8-ACB7-D04F05CDA180}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Activities.Email", "src\activities\Elsa.Activities.Email\Elsa.Activities.Email.csproj", "{D20FCB88-9DCA-49EA-9CC2-5B94DD935D30}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Activities.Timers", "src\activities\Elsa.Activities.Timers\Elsa.Activities.Timers.csproj", "{E4B71DC4-3E73-49C3-9B4E-CA13909F222D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Activities.MassTransit", "src\activities\Elsa.Activities.MassTransit\Elsa.Activities.MassTransit.csproj", "{C4939482-9447-47D1-B6AF-E9F8C6323841}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{5E5E1E84-DDBC-40D6-B891-0D563A15A44A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Activities.UserTask", "src\activities\Elsa.Activities.UserTask\Elsa.Activities.UserTask.csproj", "{823F80B6-E241-43F7-83BD-29FBB58A77F9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Activities.Dropbox", "src\activities\Elsa.Activities.Dropbox\Elsa.Activities.Dropbox.csproj", "{79E85459-EF54-44D6-9508-1E68B8238D00}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "scripting", "scripting", "{9C3C685E-3D7D-4638-A031-24F71CF74B52}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa", "src\core\Elsa\Elsa.csproj", "{6BB5EB72-AD9A-41ED-A6AA-0FF1093EA41B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Scripting.JavaScript", "src\scripting\Elsa.Scripting.JavaScript\Elsa.Scripting.JavaScript.csproj", "{18BE8F72-E528-4617-B1B1-07BD35337DFC}" +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}") = "server", "server", "{468E498C-59DB-4541-8D8A-0D89DE9083AB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Server.Host", "src\server\Elsa.Server.Host\Elsa.Server.Host.csproj", "{FC54EDBA-71FB-4A87-8FD5-54759DF77CCE}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{AB1AE008-6FD6-414C-8E88-D735F42E1FA6}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "integration", "integration", "{0A3C36AB-2ACF-4175-A512-66B4C3DB9371}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "shared", "shared", "{0A6747EA-7AC6-4B6F-BC0C-C40C8A80C44D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Testing.Shared", "test\shared\Elsa.Testing.Shared\Elsa.Testing.Shared.csproj", "{E7C689EB-5AD6-4E91-A007-6116EEA702FC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.DistributedLocking.SqlServer", "src\providers\Elsa.DistributedLocking.SqlServer\Elsa.DistributedLocking.SqlServer.csproj", "{150EF356-E8BC-4922-91C2-362017479409}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.DistributedLocking.Redis", "src\providers\Elsa.DistributedLocking.Redis\Elsa.DistributedLocking.Redis.csproj", "{EBD49CCA-5400-4C36-B5DF-7B28190AA323}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.DistributedLocking.AzureBlob", "src\providers\Elsa.DistributedLocking.AzureBlob\Elsa.DistributedLocking.AzureBlob.csproj", "{E20238CE-5C64-4F87-8753-3B4E1EC9A740}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "locking", "locking", "{7CD5C8D5-EC78-4A99-A514-F01CA7197AC8}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Core.IntegrationTests", "test\integration\Elsa.Core.IntegrationTests\Elsa.Core.IntegrationTests.csproj", "{4CB34AB3-01C9-4911-8914-EABAA744EAD3}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "component", "component", "{FC47A50F-03B2-47D8-AAFB-075314FBA186}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.ComponentTests", "test\component\Elsa.ComponentTests\Elsa.ComponentTests.csproj", "{BB5819C7-434A-4AC5-8B0E-6C4FA672EBD5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Server.Api", "src\server\Elsa.Server.Api\Elsa.Server.Api.csproj", "{44E0B699-A140-4551-A0E9-9FD9F171A9C2}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "clients", "clients", "{E43FB9E7-7851-4880-B7EE-12B8CEE628D0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Client", "src\clients\Elsa.Client\Elsa.Client.csproj", "{2DA042D6-1E3C-4B15-B48E-BF45426C74E1}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "servicebus", "servicebus", "{47EDFC14-BB99-44BF-A447-035D40D7347B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Rebus.AzureServiceBus", "src\servicebus\Elsa.Rebus.AzureServiceBus\Elsa.Rebus.AzureServiceBus.csproj", "{D3440E66-A871-4AB0-A1E0-8B3864ACA16A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Rebus.RabbitMq", "src\servicebus\Elsa.Rebus.RabbitMq\Elsa.Rebus.RabbitMq.csproj", "{FC656D28-1AA3-462D-9B18-A10436E47C08}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Activities.AzureServiceBus", "src\activities\Elsa.Activities.AzureServiceBus\Elsa.Activities.AzureServiceBus.csproj", "{DD607BC1-F9D9-4685-BC8F-A4056C2C31FA}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "persistence", "persistence", "{5619F343-A270-4E31-9C52-7C85A4DD6D71}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Persistence.InMemory", "src\persistence\Elsa.Persistence.InMemory\Elsa.Persistence.InMemory.csproj", "{BA9EE5A2-632F-4489-B59D-C7283960BCCA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Persistence.YesSql", "src\persistence\Elsa.Persistence.YesSql\Elsa.Persistence.YesSql.csproj", "{7E14324E-7AD3-4498-AECE-C7B80FB691BC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Persistence.MongoDb", "src\persistence\Elsa.Persistence.MongoDb\Elsa.Persistence.MongoDb.csproj", "{09718131-4D0E-4EF3-B3FB-116EBE1D8702}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "worker", "worker", "{E42743A0-FBDD-4150-9D53-6000496D9B87}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "console", "console", "{FC9F520F-BA51-4AD2-BFEE-EF787798E734}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "aspnet", "aspnet", "{22E75696-6FE9-436A-9097-EE21C603F818}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.ContextualWorkflowHttp", "src\samples\aspnet\Elsa.Samples.ContextualWorkflowHttp\Elsa.Samples.ContextualWorkflowHttp.csproj", "{2EC02600-8367-4B25-8243-CA4E53FA00FA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.CorrelationHttp", "src\samples\aspnet\Elsa.Samples.CorrelationHttp\Elsa.Samples.CorrelationHttp.csproj", "{3BDA353A-660E-47FA-95F5-4F6BB8E6B8AD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.CustomActivities", "src\samples\aspnet\Elsa.Samples.CustomActivities\Elsa.Samples.CustomActivities.csproj", "{AC6AA60A-393F-4D49-B3F1-44F567B18E22}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.ForkJoinTimerAndSignalHttp", "src\samples\aspnet\Elsa.Samples.ForkJoinTimerAndSignalHttp\Elsa.Samples.ForkJoinTimerAndSignalHttp.csproj", "{8BB1B34D-E0FC-4804-9098-E7F8E35A749A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.HelloWorldHttp", "src\samples\aspnet\Elsa.Samples.HelloWorldHttp\Elsa.Samples.HelloWorldHttp.csproj", "{15FDEF59-32F8-4F8F-AE10-B3D0FEE03049}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.ReadModelHttp", "src\samples\aspnet\Elsa.Samples.ReadModelHttp\Elsa.Samples.ReadModelHttp.csproj", "{795FF94C-F22C-45A3-9643-88EED173D6D4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.DeclarativeCompositeActivitiesConsole", "src\samples\console\Elsa.Samples.DeclarativeCompositeActivitiesConsole\Elsa.Samples.DeclarativeCompositeActivitiesConsole.csproj", "{7EC9B4E1-820E-4D53-B4E2-9815E31C7AE8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.FileBasedWorkflow", "src\samples\console\Elsa.Samples.FileBasedWorkflow\Elsa.Samples.FileBasedWorkflow.csproj", "{C6A54F89-271D-402E-A38D-6C3A9DB7DF9C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.ForLoopConsole", "src\samples\console\Elsa.Samples.ForLoopConsole\Elsa.Samples.ForLoopConsole.csproj", "{F5124847-D046-4458-A89D-CD796FEDEE1A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.GoBackConsole", "src\samples\console\Elsa.Samples.GoBackConsole\Elsa.Samples.GoBackConsole.csproj", "{0B147307-64FF-4496-9DC9-8F83013AC045}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.HelloWorldConsole", "src\samples\console\Elsa.Samples.HelloWorldConsole\Elsa.Samples.HelloWorldConsole.csproj", "{935888CF-E871-42BB-A47D-5E1168269A03}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.IfElseConsole", "src\samples\console\Elsa.Samples.IfElseConsole\Elsa.Samples.IfElseConsole.csproj", "{EA1D7E39-D77D-4B13-BAD0-76BA30547019}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.ProgrammaticCompositeActivitiesConsole", "src\samples\console\Elsa.Samples.ProgrammaticCompositeActivitiesConsole\Elsa.Samples.ProgrammaticCompositeActivitiesConsole.csproj", "{0FC36CEC-35B3-4EB7-9DD7-0F2A1C4E9313}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.ReadLineEchoConsole", "src\samples\console\Elsa.Samples.ReadLineEchoConsole\Elsa.Samples.ReadLineEchoConsole.csproj", "{E7BAECCC-CBF8-4975-93C4-6D3A8F94B000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.Serialization", "src\samples\console\Elsa.Samples.Serialization\Elsa.Samples.Serialization.csproj", "{823EB953-0B26-4D85-9B3F-14FCB476E987}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.SignalingConsole", "src\samples\console\Elsa.Samples.SignalingConsole\Elsa.Samples.SignalingConsole.csproj", "{83929B86-434B-4C24-9B02-1F944DF8D71C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.WhileLoopConsole", "src\samples\console\Elsa.Samples.WhileLoopConsole\Elsa.Samples.WhileLoopConsole.csproj", "{EDE80D8C-4C1F-44A3-8D0E-6D0757439E1C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.AzureServiceBusWorker", "src\samples\worker\Elsa.Samples.AzureServiceBusWorker\Elsa.Samples.AzureServiceBusWorker.csproj", "{F958B682-5192-4287-BF80-CB7B30ECFC9E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.DistributedLock", "src\samples\worker\Elsa.Samples.DistributedLock\Elsa.Samples.DistributedLock.csproj", "{F081EE15-7E1A-4E8C-B91F-5472ED565431}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.MultiTenantChildWorker", "src\samples\worker\Elsa.Samples.MultiTenantChildWorker\Elsa.Samples.MultiTenantChildWorker.csproj", "{1053BF2D-BCB6-4616-9773-7FF25F48ECA3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.RebusWorker", "src\samples\worker\Elsa.Samples.RebusWorker\Elsa.Samples.RebusWorker.csproj", "{6837DB22-1F5C-42E1-A466-E4597AF6E91E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.RunChildWorkflowWorker", "src\samples\worker\Elsa.Samples.RunChildWorkflowWorker\Elsa.Samples.RunChildWorkflowWorker.csproj", "{A4DF29BD-95CC-4A86-96EC-FB6692270E68}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.Timers", "src\samples\worker\Elsa.Samples.Timers\Elsa.Samples.Timers.csproj", "{FD2D1BD0-1229-4DCF-BE70-6BFD396DD489}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.WhileLoopWorker", "src\samples\worker\Elsa.Samples.WhileLoopWorker\Elsa.Samples.WhileLoopWorker.csproj", "{EA3832C4-8079-4E84-AF8C-12744E4EFD44}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.CustomAttributesChildWorker", "src\samples\worker\Elsa.Samples.CustomAttributesChildWorker\Elsa.Samples.CustomAttributesChildWorker.csproj", "{AEA00027-F280-43A4-AC60-E2AF3014CF34}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.Interrupts", "src\samples\aspnet\Elsa.Samples.Interrupts\Elsa.Samples.Interrupts.csproj", "{E0090EF3-C4A7-4262-9300-1D395BE25DD0}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {300EE2D5-54C5-46F2-AD03-BB43589EA074}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {300EE2D5-54C5-46F2-AD03-BB43589EA074}.Debug|Any CPU.Build.0 = Debug|Any CPU + {300EE2D5-54C5-46F2-AD03-BB43589EA074}.Release|Any CPU.ActiveCfg = Release|Any CPU + {300EE2D5-54C5-46F2-AD03-BB43589EA074}.Release|Any CPU.Build.0 = Release|Any CPU + {3130C574-557C-4DA2-933E-AED7A9EBE48A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3130C574-557C-4DA2-933E-AED7A9EBE48A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3130C574-557C-4DA2-933E-AED7A9EBE48A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3130C574-557C-4DA2-933E-AED7A9EBE48A}.Release|Any CPU.Build.0 = Release|Any CPU + {B98B80CB-D3A3-437C-A61C-ED82C8C77B2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B98B80CB-D3A3-437C-A61C-ED82C8C77B2F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B98B80CB-D3A3-437C-A61C-ED82C8C77B2F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B98B80CB-D3A3-437C-A61C-ED82C8C77B2F}.Release|Any CPU.Build.0 = Release|Any CPU + {1D63E1B4-2386-4BEC-9090-C3F3CBF25703}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1D63E1B4-2386-4BEC-9090-C3F3CBF25703}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1D63E1B4-2386-4BEC-9090-C3F3CBF25703}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1D63E1B4-2386-4BEC-9090-C3F3CBF25703}.Release|Any CPU.Build.0 = Release|Any CPU + {D20FCB88-9DCA-49EA-9CC2-5B94DD935D30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D20FCB88-9DCA-49EA-9CC2-5B94DD935D30}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D20FCB88-9DCA-49EA-9CC2-5B94DD935D30}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D20FCB88-9DCA-49EA-9CC2-5B94DD935D30}.Release|Any CPU.Build.0 = Release|Any CPU + {E4B71DC4-3E73-49C3-9B4E-CA13909F222D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E4B71DC4-3E73-49C3-9B4E-CA13909F222D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E4B71DC4-3E73-49C3-9B4E-CA13909F222D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E4B71DC4-3E73-49C3-9B4E-CA13909F222D}.Release|Any CPU.Build.0 = Release|Any CPU + {C4939482-9447-47D1-B6AF-E9F8C6323841}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C4939482-9447-47D1-B6AF-E9F8C6323841}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C4939482-9447-47D1-B6AF-E9F8C6323841}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C4939482-9447-47D1-B6AF-E9F8C6323841}.Release|Any CPU.Build.0 = Release|Any CPU + {823F80B6-E241-43F7-83BD-29FBB58A77F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {823F80B6-E241-43F7-83BD-29FBB58A77F9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {823F80B6-E241-43F7-83BD-29FBB58A77F9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {823F80B6-E241-43F7-83BD-29FBB58A77F9}.Release|Any CPU.Build.0 = Release|Any CPU + {79E85459-EF54-44D6-9508-1E68B8238D00}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {79E85459-EF54-44D6-9508-1E68B8238D00}.Debug|Any CPU.Build.0 = Debug|Any CPU + {79E85459-EF54-44D6-9508-1E68B8238D00}.Release|Any CPU.ActiveCfg = Release|Any CPU + {79E85459-EF54-44D6-9508-1E68B8238D00}.Release|Any CPU.Build.0 = Release|Any CPU + {6BB5EB72-AD9A-41ED-A6AA-0FF1093EA41B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6BB5EB72-AD9A-41ED-A6AA-0FF1093EA41B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6BB5EB72-AD9A-41ED-A6AA-0FF1093EA41B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6BB5EB72-AD9A-41ED-A6AA-0FF1093EA41B}.Release|Any CPU.Build.0 = Release|Any CPU + {18BE8F72-E528-4617-B1B1-07BD35337DFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {18BE8F72-E528-4617-B1B1-07BD35337DFC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {18BE8F72-E528-4617-B1B1-07BD35337DFC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {18BE8F72-E528-4617-B1B1-07BD35337DFC}.Release|Any CPU.Build.0 = Release|Any CPU + {01DC21DD-C6E2-4B21-864E-97D29448F777}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {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 + {FC54EDBA-71FB-4A87-8FD5-54759DF77CCE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FC54EDBA-71FB-4A87-8FD5-54759DF77CCE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FC54EDBA-71FB-4A87-8FD5-54759DF77CCE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FC54EDBA-71FB-4A87-8FD5-54759DF77CCE}.Release|Any CPU.Build.0 = Release|Any CPU + {E7C689EB-5AD6-4E91-A007-6116EEA702FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E7C689EB-5AD6-4E91-A007-6116EEA702FC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E7C689EB-5AD6-4E91-A007-6116EEA702FC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E7C689EB-5AD6-4E91-A007-6116EEA702FC}.Release|Any CPU.Build.0 = Release|Any CPU + {150EF356-E8BC-4922-91C2-362017479409}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {150EF356-E8BC-4922-91C2-362017479409}.Debug|Any CPU.Build.0 = Debug|Any CPU + {150EF356-E8BC-4922-91C2-362017479409}.Release|Any CPU.ActiveCfg = Release|Any CPU + {150EF356-E8BC-4922-91C2-362017479409}.Release|Any CPU.Build.0 = Release|Any CPU + {EBD49CCA-5400-4C36-B5DF-7B28190AA323}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EBD49CCA-5400-4C36-B5DF-7B28190AA323}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EBD49CCA-5400-4C36-B5DF-7B28190AA323}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EBD49CCA-5400-4C36-B5DF-7B28190AA323}.Release|Any CPU.Build.0 = Release|Any CPU + {E20238CE-5C64-4F87-8753-3B4E1EC9A740}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E20238CE-5C64-4F87-8753-3B4E1EC9A740}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E20238CE-5C64-4F87-8753-3B4E1EC9A740}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E20238CE-5C64-4F87-8753-3B4E1EC9A740}.Release|Any CPU.Build.0 = Release|Any CPU + {4CB34AB3-01C9-4911-8914-EABAA744EAD3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4CB34AB3-01C9-4911-8914-EABAA744EAD3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4CB34AB3-01C9-4911-8914-EABAA744EAD3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4CB34AB3-01C9-4911-8914-EABAA744EAD3}.Release|Any CPU.Build.0 = Release|Any CPU + {BB5819C7-434A-4AC5-8B0E-6C4FA672EBD5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BB5819C7-434A-4AC5-8B0E-6C4FA672EBD5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BB5819C7-434A-4AC5-8B0E-6C4FA672EBD5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BB5819C7-434A-4AC5-8B0E-6C4FA672EBD5}.Release|Any CPU.Build.0 = Release|Any CPU + {44E0B699-A140-4551-A0E9-9FD9F171A9C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {44E0B699-A140-4551-A0E9-9FD9F171A9C2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {44E0B699-A140-4551-A0E9-9FD9F171A9C2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {44E0B699-A140-4551-A0E9-9FD9F171A9C2}.Release|Any CPU.Build.0 = Release|Any CPU + {2DA042D6-1E3C-4B15-B48E-BF45426C74E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2DA042D6-1E3C-4B15-B48E-BF45426C74E1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2DA042D6-1E3C-4B15-B48E-BF45426C74E1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2DA042D6-1E3C-4B15-B48E-BF45426C74E1}.Release|Any CPU.Build.0 = Release|Any CPU + {25015984-7F81-454C-AC6E-E6DC810A59E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {25015984-7F81-454C-AC6E-E6DC810A59E2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {25015984-7F81-454C-AC6E-E6DC810A59E2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {25015984-7F81-454C-AC6E-E6DC810A59E2}.Release|Any CPU.Build.0 = Release|Any CPU + {DC9B6EEA-E692-4AF7-9A5A-870FAC4B5EB2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DC9B6EEA-E692-4AF7-9A5A-870FAC4B5EB2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DC9B6EEA-E692-4AF7-9A5A-870FAC4B5EB2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DC9B6EEA-E692-4AF7-9A5A-870FAC4B5EB2}.Release|Any CPU.Build.0 = Release|Any CPU + {04FD384F-1B78-4D4C-9815-F9FBDA1B9245}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {04FD384F-1B78-4D4C-9815-F9FBDA1B9245}.Debug|Any CPU.Build.0 = Debug|Any CPU + {04FD384F-1B78-4D4C-9815-F9FBDA1B9245}.Release|Any CPU.ActiveCfg = Release|Any CPU + {04FD384F-1B78-4D4C-9815-F9FBDA1B9245}.Release|Any CPU.Build.0 = Release|Any CPU + {EDD20103-2089-48D7-A445-6FA8183CA376}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EDD20103-2089-48D7-A445-6FA8183CA376}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EDD20103-2089-48D7-A445-6FA8183CA376}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EDD20103-2089-48D7-A445-6FA8183CA376}.Release|Any CPU.Build.0 = Release|Any CPU + {8DD4F1E8-8AC8-4AB4-AC08-9456AA6EAF10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8DD4F1E8-8AC8-4AB4-AC08-9456AA6EAF10}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8DD4F1E8-8AC8-4AB4-AC08-9456AA6EAF10}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8DD4F1E8-8AC8-4AB4-AC08-9456AA6EAF10}.Release|Any CPU.Build.0 = Release|Any CPU + {F7181887-E6B5-4DA9-9598-8E9E806B5A20}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F7181887-E6B5-4DA9-9598-8E9E806B5A20}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F7181887-E6B5-4DA9-9598-8E9E806B5A20}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F7181887-E6B5-4DA9-9598-8E9E806B5A20}.Release|Any CPU.Build.0 = Release|Any CPU + {115DEB38-679F-467E-8F87-9E669DFD2EB8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {115DEB38-679F-467E-8F87-9E669DFD2EB8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {115DEB38-679F-467E-8F87-9E669DFD2EB8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {115DEB38-679F-467E-8F87-9E669DFD2EB8}.Release|Any CPU.Build.0 = Release|Any CPU + {D3440E66-A871-4AB0-A1E0-8B3864ACA16A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D3440E66-A871-4AB0-A1E0-8B3864ACA16A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D3440E66-A871-4AB0-A1E0-8B3864ACA16A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D3440E66-A871-4AB0-A1E0-8B3864ACA16A}.Release|Any CPU.Build.0 = Release|Any CPU + {FC656D28-1AA3-462D-9B18-A10436E47C08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FC656D28-1AA3-462D-9B18-A10436E47C08}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FC656D28-1AA3-462D-9B18-A10436E47C08}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FC656D28-1AA3-462D-9B18-A10436E47C08}.Release|Any CPU.Build.0 = Release|Any CPU + {DD607BC1-F9D9-4685-BC8F-A4056C2C31FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DD607BC1-F9D9-4685-BC8F-A4056C2C31FA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DD607BC1-F9D9-4685-BC8F-A4056C2C31FA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DD607BC1-F9D9-4685-BC8F-A4056C2C31FA}.Release|Any CPU.Build.0 = Release|Any CPU + {BA9EE5A2-632F-4489-B59D-C7283960BCCA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BA9EE5A2-632F-4489-B59D-C7283960BCCA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BA9EE5A2-632F-4489-B59D-C7283960BCCA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BA9EE5A2-632F-4489-B59D-C7283960BCCA}.Release|Any CPU.Build.0 = Release|Any CPU + {7E14324E-7AD3-4498-AECE-C7B80FB691BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7E14324E-7AD3-4498-AECE-C7B80FB691BC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7E14324E-7AD3-4498-AECE-C7B80FB691BC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7E14324E-7AD3-4498-AECE-C7B80FB691BC}.Release|Any CPU.Build.0 = Release|Any CPU + {09718131-4D0E-4EF3-B3FB-116EBE1D8702}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {09718131-4D0E-4EF3-B3FB-116EBE1D8702}.Debug|Any CPU.Build.0 = Debug|Any CPU + {09718131-4D0E-4EF3-B3FB-116EBE1D8702}.Release|Any CPU.ActiveCfg = Release|Any CPU + {09718131-4D0E-4EF3-B3FB-116EBE1D8702}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {300EE2D5-54C5-46F2-AD03-BB43589EA074} = {35F44BE9-13D0-417C-A01A-F0787BEE6DC3} + {3130C574-557C-4DA2-933E-AED7A9EBE48A} = {35F44BE9-13D0-417C-A01A-F0787BEE6DC3} + {35F44BE9-13D0-417C-A01A-F0787BEE6DC3} = {DA71CDAA-8DD3-4D5F-9FBD-8E4B37A2D925} + {B98B80CB-D3A3-437C-A61C-ED82C8C77B2F} = {B43B546E-23F3-46E8-ACB7-D04F05CDA180} + {1D63E1B4-2386-4BEC-9090-C3F3CBF25703} = {B43B546E-23F3-46E8-ACB7-D04F05CDA180} + {B43B546E-23F3-46E8-ACB7-D04F05CDA180} = {DA71CDAA-8DD3-4D5F-9FBD-8E4B37A2D925} + {D20FCB88-9DCA-49EA-9CC2-5B94DD935D30} = {B43B546E-23F3-46E8-ACB7-D04F05CDA180} + {E4B71DC4-3E73-49C3-9B4E-CA13909F222D} = {B43B546E-23F3-46E8-ACB7-D04F05CDA180} + {C4939482-9447-47D1-B6AF-E9F8C6323841} = {B43B546E-23F3-46E8-ACB7-D04F05CDA180} + {5E5E1E84-DDBC-40D6-B891-0D563A15A44A} = {DA71CDAA-8DD3-4D5F-9FBD-8E4B37A2D925} + {823F80B6-E241-43F7-83BD-29FBB58A77F9} = {B43B546E-23F3-46E8-ACB7-D04F05CDA180} + {79E85459-EF54-44D6-9508-1E68B8238D00} = {B43B546E-23F3-46E8-ACB7-D04F05CDA180} + {9C3C685E-3D7D-4638-A031-24F71CF74B52} = {DA71CDAA-8DD3-4D5F-9FBD-8E4B37A2D925} + {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} + {468E498C-59DB-4541-8D8A-0D89DE9083AB} = {DA71CDAA-8DD3-4D5F-9FBD-8E4B37A2D925} + {FC54EDBA-71FB-4A87-8FD5-54759DF77CCE} = {468E498C-59DB-4541-8D8A-0D89DE9083AB} + {0A3C36AB-2ACF-4175-A512-66B4C3DB9371} = {AB1AE008-6FD6-414C-8E88-D735F42E1FA6} + {0A6747EA-7AC6-4B6F-BC0C-C40C8A80C44D} = {AB1AE008-6FD6-414C-8E88-D735F42E1FA6} + {E7C689EB-5AD6-4E91-A007-6116EEA702FC} = {0A6747EA-7AC6-4B6F-BC0C-C40C8A80C44D} + {150EF356-E8BC-4922-91C2-362017479409} = {7CD5C8D5-EC78-4A99-A514-F01CA7197AC8} + {EBD49CCA-5400-4C36-B5DF-7B28190AA323} = {7CD5C8D5-EC78-4A99-A514-F01CA7197AC8} + {E20238CE-5C64-4F87-8753-3B4E1EC9A740} = {7CD5C8D5-EC78-4A99-A514-F01CA7197AC8} + {7CD5C8D5-EC78-4A99-A514-F01CA7197AC8} = {DA71CDAA-8DD3-4D5F-9FBD-8E4B37A2D925} + {4CB34AB3-01C9-4911-8914-EABAA744EAD3} = {0A3C36AB-2ACF-4175-A512-66B4C3DB9371} + {FC47A50F-03B2-47D8-AAFB-075314FBA186} = {AB1AE008-6FD6-414C-8E88-D735F42E1FA6} + {BB5819C7-434A-4AC5-8B0E-6C4FA672EBD5} = {FC47A50F-03B2-47D8-AAFB-075314FBA186} + {44E0B699-A140-4551-A0E9-9FD9F171A9C2} = {468E498C-59DB-4541-8D8A-0D89DE9083AB} + {E43FB9E7-7851-4880-B7EE-12B8CEE628D0} = {DA71CDAA-8DD3-4D5F-9FBD-8E4B37A2D925} + {2DA042D6-1E3C-4B15-B48E-BF45426C74E1} = {E43FB9E7-7851-4880-B7EE-12B8CEE628D0} + {5583B236-794A-422C-B306-52BB7DFE7EBE} = {DA71CDAA-8DD3-4D5F-9FBD-8E4B37A2D925} + {5837821B-CA71-40B6-A9F1-C25D318B4691} = {5583B236-794A-422C-B306-52BB7DFE7EBE} + {25015984-7F81-454C-AC6E-E6DC810A59E2} = {5837821B-CA71-40B6-A9F1-C25D318B4691} + {DC9B6EEA-E692-4AF7-9A5A-870FAC4B5EB2} = {5837821B-CA71-40B6-A9F1-C25D318B4691} + {04FD384F-1B78-4D4C-9815-F9FBDA1B9245} = {5837821B-CA71-40B6-A9F1-C25D318B4691} + {EDD20103-2089-48D7-A445-6FA8183CA376} = {5837821B-CA71-40B6-A9F1-C25D318B4691} + {8DD4F1E8-8AC8-4AB4-AC08-9456AA6EAF10} = {5837821B-CA71-40B6-A9F1-C25D318B4691} + {F7181887-E6B5-4DA9-9598-8E9E806B5A20} = {5837821B-CA71-40B6-A9F1-C25D318B4691} + {115DEB38-679F-467E-8F87-9E669DFD2EB8} = {B43B546E-23F3-46E8-ACB7-D04F05CDA180} + {47EDFC14-BB99-44BF-A447-035D40D7347B} = {DA71CDAA-8DD3-4D5F-9FBD-8E4B37A2D925} + {D3440E66-A871-4AB0-A1E0-8B3864ACA16A} = {47EDFC14-BB99-44BF-A447-035D40D7347B} + {FC656D28-1AA3-462D-9B18-A10436E47C08} = {47EDFC14-BB99-44BF-A447-035D40D7347B} + {DD607BC1-F9D9-4685-BC8F-A4056C2C31FA} = {B43B546E-23F3-46E8-ACB7-D04F05CDA180} + {E42743A0-FBDD-4150-9D53-6000496D9B87} = {5E5E1E84-DDBC-40D6-B891-0D563A15A44A} + {FC9F520F-BA51-4AD2-BFEE-EF787798E734} = {5E5E1E84-DDBC-40D6-B891-0D563A15A44A} + {22E75696-6FE9-436A-9097-EE21C603F818} = {5E5E1E84-DDBC-40D6-B891-0D563A15A44A} + {2EC02600-8367-4B25-8243-CA4E53FA00FA} = {22E75696-6FE9-436A-9097-EE21C603F818} + {3BDA353A-660E-47FA-95F5-4F6BB8E6B8AD} = {22E75696-6FE9-436A-9097-EE21C603F818} + {AC6AA60A-393F-4D49-B3F1-44F567B18E22} = {22E75696-6FE9-436A-9097-EE21C603F818} + {8BB1B34D-E0FC-4804-9098-E7F8E35A749A} = {22E75696-6FE9-436A-9097-EE21C603F818} + {15FDEF59-32F8-4F8F-AE10-B3D0FEE03049} = {22E75696-6FE9-436A-9097-EE21C603F818} + {795FF94C-F22C-45A3-9643-88EED173D6D4} = {22E75696-6FE9-436A-9097-EE21C603F818} + {7EC9B4E1-820E-4D53-B4E2-9815E31C7AE8} = {FC9F520F-BA51-4AD2-BFEE-EF787798E734} + {C6A54F89-271D-402E-A38D-6C3A9DB7DF9C} = {FC9F520F-BA51-4AD2-BFEE-EF787798E734} + {F5124847-D046-4458-A89D-CD796FEDEE1A} = {FC9F520F-BA51-4AD2-BFEE-EF787798E734} + {0B147307-64FF-4496-9DC9-8F83013AC045} = {FC9F520F-BA51-4AD2-BFEE-EF787798E734} + {935888CF-E871-42BB-A47D-5E1168269A03} = {FC9F520F-BA51-4AD2-BFEE-EF787798E734} + {EA1D7E39-D77D-4B13-BAD0-76BA30547019} = {FC9F520F-BA51-4AD2-BFEE-EF787798E734} + {0FC36CEC-35B3-4EB7-9DD7-0F2A1C4E9313} = {FC9F520F-BA51-4AD2-BFEE-EF787798E734} + {E7BAECCC-CBF8-4975-93C4-6D3A8F94B000} = {FC9F520F-BA51-4AD2-BFEE-EF787798E734} + {823EB953-0B26-4D85-9B3F-14FCB476E987} = {FC9F520F-BA51-4AD2-BFEE-EF787798E734} + {83929B86-434B-4C24-9B02-1F944DF8D71C} = {FC9F520F-BA51-4AD2-BFEE-EF787798E734} + {EDE80D8C-4C1F-44A3-8D0E-6D0757439E1C} = {FC9F520F-BA51-4AD2-BFEE-EF787798E734} + {F958B682-5192-4287-BF80-CB7B30ECFC9E} = {E42743A0-FBDD-4150-9D53-6000496D9B87} + {F081EE15-7E1A-4E8C-B91F-5472ED565431} = {E42743A0-FBDD-4150-9D53-6000496D9B87} + {1053BF2D-BCB6-4616-9773-7FF25F48ECA3} = {E42743A0-FBDD-4150-9D53-6000496D9B87} + {6837DB22-1F5C-42E1-A466-E4597AF6E91E} = {E42743A0-FBDD-4150-9D53-6000496D9B87} + {A4DF29BD-95CC-4A86-96EC-FB6692270E68} = {E42743A0-FBDD-4150-9D53-6000496D9B87} + {FD2D1BD0-1229-4DCF-BE70-6BFD396DD489} = {E42743A0-FBDD-4150-9D53-6000496D9B87} + {EA3832C4-8079-4E84-AF8C-12744E4EFD44} = {E42743A0-FBDD-4150-9D53-6000496D9B87} + {AEA00027-F280-43A4-AC60-E2AF3014CF34} = {E42743A0-FBDD-4150-9D53-6000496D9B87} + {E0090EF3-C4A7-4262-9300-1D395BE25DD0} = {22E75696-6FE9-436A-9097-EE21C603F818} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {8B0975FD-7050-48B0-88C5-48C33378E158} + EndGlobalSection +EndGlobal diff --git a/README.md b/README.md index a4e798acd..48933cad7 100644 --- a/README.md +++ b/README.md @@ -118,7 +118,13 @@ This models is then serialized to JSON and deserialized back into the model ```csharp // Create a service container with Elsa services. var services = new ServiceCollection() - .AddElsa(option => option.UsePersistence(db => db.UseSqLite("Data Source=elsa.db;Cache=Shared", IsolationLevel.ReadUncommitted))) + .AddElsa() + + // For tests + .AddElsaPersistenceInMemory() + // For productive use + .AddElsaPersistenceYesSql((sp, config) => config.UseSqLite("Data Source=elsa.db;Cache=Shared", IsolationLevel.ReadUncommitted)) + .AddConsoleActivities() .BuildServiceProvider(); diff --git a/Samples.sln b/Samples.sln index 8b032a469..9d80ebd79 100644 --- a/Samples.sln +++ b/Samples.sln @@ -64,47 +64,47 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.DistributedLocking.Sql EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.DistributedLocking.Redis", "src\providers\Elsa.DistributedLocking.Redis\Elsa.DistributedLocking.Redis.csproj", "{EBD49CCA-5400-4C36-B5DF-7B28190AA323}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.DistributedLocking.AzureBlob", "src\providers\Elsa.DistributedLocking.AzureBlob\Elsa.DistributedLocking.AzureBlob.csproj", "{E20238CE-5C64-4F87-8753-3B4E1EC9A740}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.DistributedLocking.AzureBlob", "src\providers\Elsa.DistributedLocking.AzureBlob\Elsa.DistributedLocking.AzureBlob.csproj", "{E20238CE-5C64-4F87-8753-3B4E1EC9A740}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "locking", "locking", "{7CD5C8D5-EC78-4A99-A514-F01CA7197AC8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Core.IntegrationTests", "test\integration\Elsa.Core.IntegrationTests\Elsa.Core.IntegrationTests.csproj", "{4CB34AB3-01C9-4911-8914-EABAA744EAD3}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Core.IntegrationTests", "test\integration\Elsa.Core.IntegrationTests\Elsa.Core.IntegrationTests.csproj", "{4CB34AB3-01C9-4911-8914-EABAA744EAD3}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "component", "component", "{FC47A50F-03B2-47D8-AAFB-075314FBA186}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.ComponentTests", "test\component\Elsa.ComponentTests\Elsa.ComponentTests.csproj", "{BB5819C7-434A-4AC5-8B0E-6C4FA672EBD5}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.ComponentTests", "test\component\Elsa.ComponentTests\Elsa.ComponentTests.csproj", "{BB5819C7-434A-4AC5-8B0E-6C4FA672EBD5}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Server.Api", "src\server\Elsa.Server.Api\Elsa.Server.Api.csproj", "{44E0B699-A140-4551-A0E9-9FD9F171A9C2}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Server.Api", "src\server\Elsa.Server.Api\Elsa.Server.Api.csproj", "{44E0B699-A140-4551-A0E9-9FD9F171A9C2}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "clients", "clients", "{E43FB9E7-7851-4880-B7EE-12B8CEE628D0}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Client", "src\clients\Elsa.Client\Elsa.Client.csproj", "{2DA042D6-1E3C-4B15-B48E-BF45426C74E1}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Client", "src\clients\Elsa.Client\Elsa.Client.csproj", "{2DA042D6-1E3C-4B15-B48E-BF45426C74E1}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dashboards", "dashboards", "{5583B236-794A-422C-B306-52BB7DFE7EBE}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "blazor", "blazor", "{5837821B-CA71-40B6-A9F1-C25D318B4691}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ElsaDashboard.Backend", "src\dashboards\blazor\ElsaDashboard.Backend\ElsaDashboard.Backend.csproj", "{25015984-7F81-454C-AC6E-E6DC810A59E2}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ElsaDashboard.Backend", "src\dashboards\blazor\ElsaDashboard.Backend\ElsaDashboard.Backend.csproj", "{25015984-7F81-454C-AC6E-E6DC810A59E2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ElsaDashboard.Shared", "src\dashboards\blazor\ElsaDashboard.Shared\ElsaDashboard.Shared.csproj", "{DC9B6EEA-E692-4AF7-9A5A-870FAC4B5EB2}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ElsaDashboard.Shared", "src\dashboards\blazor\ElsaDashboard.Shared\ElsaDashboard.Shared.csproj", "{DC9B6EEA-E692-4AF7-9A5A-870FAC4B5EB2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ElsaDashboard.WebAssembly", "src\dashboards\blazor\ElsaDashboard.WebAssembly\ElsaDashboard.WebAssembly.csproj", "{04FD384F-1B78-4D4C-9815-F9FBDA1B9245}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ElsaDashboard.WebAssembly", "src\dashboards\blazor\ElsaDashboard.WebAssembly\ElsaDashboard.WebAssembly.csproj", "{04FD384F-1B78-4D4C-9815-F9FBDA1B9245}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ElsaDashboard.Application", "src\dashboards\blazor\ElsaDashboard.Application\ElsaDashboard.Application.csproj", "{EDD20103-2089-48D7-A445-6FA8183CA376}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ElsaDashboard.Application", "src\dashboards\blazor\ElsaDashboard.Application\ElsaDashboard.Application.csproj", "{EDD20103-2089-48D7-A445-6FA8183CA376}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ElsaDashboard.Application.Server", "src\dashboards\blazor\ElsaDashboard.Application.Server\ElsaDashboard.Application.Server.csproj", "{8DD4F1E8-8AC8-4AB4-AC08-9456AA6EAF10}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ElsaDashboard.Application.Server", "src\dashboards\blazor\ElsaDashboard.Application.Server\ElsaDashboard.Application.Server.csproj", "{8DD4F1E8-8AC8-4AB4-AC08-9456AA6EAF10}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ElsaDashboard.Application.WebAssembly", "src\dashboards\blazor\ElsaDashboard.Application.WebAssembly\ElsaDashboard.Application.WebAssembly.csproj", "{F7181887-E6B5-4DA9-9598-8E9E806B5A20}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ElsaDashboard.Application.WebAssembly", "src\dashboards\blazor\ElsaDashboard.Application.WebAssembly\ElsaDashboard.Application.WebAssembly.csproj", "{F7181887-E6B5-4DA9-9598-8E9E806B5A20}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Activities.Rebus", "src\activities\Elsa.Activities.Rebus\Elsa.Activities.Rebus.csproj", "{115DEB38-679F-467E-8F87-9E669DFD2EB8}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Activities.Rebus", "src\activities\Elsa.Activities.Rebus\Elsa.Activities.Rebus.csproj", "{115DEB38-679F-467E-8F87-9E669DFD2EB8}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "servicebus", "servicebus", "{47EDFC14-BB99-44BF-A447-035D40D7347B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Rebus.AzureServiceBus", "src\servicebus\Elsa.Rebus.AzureServiceBus\Elsa.Rebus.AzureServiceBus.csproj", "{D3440E66-A871-4AB0-A1E0-8B3864ACA16A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Rebus.AzureServiceBus", "src\servicebus\Elsa.Rebus.AzureServiceBus\Elsa.Rebus.AzureServiceBus.csproj", "{D3440E66-A871-4AB0-A1E0-8B3864ACA16A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Rebus.RabbitMq", "src\servicebus\Elsa.Rebus.RabbitMq\Elsa.Rebus.RabbitMq.csproj", "{FC656D28-1AA3-462D-9B18-A10436E47C08}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Rebus.RabbitMq", "src\servicebus\Elsa.Rebus.RabbitMq\Elsa.Rebus.RabbitMq.csproj", "{FC656D28-1AA3-462D-9B18-A10436E47C08}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Activities.AzureServiceBus", "src\activities\Elsa.Activities.AzureServiceBus\Elsa.Activities.AzureServiceBus.csproj", "{DD607BC1-F9D9-4685-BC8F-A4056C2C31FA}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Activities.AzureServiceBus", "src\activities\Elsa.Activities.AzureServiceBus\Elsa.Activities.AzureServiceBus.csproj", "{DD607BC1-F9D9-4685-BC8F-A4056C2C31FA}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "worker", "worker", "{E42743A0-FBDD-4150-9D53-6000496D9B87}" EndProject @@ -112,57 +112,65 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "console", "console", "{FC9F EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "aspnet", "aspnet", "{22E75696-6FE9-436A-9097-EE21C603F818}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.ContextualWorkflowHttp", "src\samples\aspnet\Elsa.Samples.ContextualWorkflowHttp\Elsa.Samples.ContextualWorkflowHttp.csproj", "{2EC02600-8367-4B25-8243-CA4E53FA00FA}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Samples.ContextualWorkflowHttp", "src\samples\aspnet\Elsa.Samples.ContextualWorkflowHttp\Elsa.Samples.ContextualWorkflowHttp.csproj", "{2EC02600-8367-4B25-8243-CA4E53FA00FA}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.CorrelationHttp", "src\samples\aspnet\Elsa.Samples.CorrelationHttp\Elsa.Samples.CorrelationHttp.csproj", "{3BDA353A-660E-47FA-95F5-4F6BB8E6B8AD}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Samples.CorrelationHttp", "src\samples\aspnet\Elsa.Samples.CorrelationHttp\Elsa.Samples.CorrelationHttp.csproj", "{3BDA353A-660E-47FA-95F5-4F6BB8E6B8AD}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.CustomActivities", "src\samples\aspnet\Elsa.Samples.CustomActivities\Elsa.Samples.CustomActivities.csproj", "{AC6AA60A-393F-4D49-B3F1-44F567B18E22}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Samples.CustomActivities", "src\samples\aspnet\Elsa.Samples.CustomActivities\Elsa.Samples.CustomActivities.csproj", "{AC6AA60A-393F-4D49-B3F1-44F567B18E22}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.ForkJoinTimerAndSignalHttp", "src\samples\aspnet\Elsa.Samples.ForkJoinTimerAndSignalHttp\Elsa.Samples.ForkJoinTimerAndSignalHttp.csproj", "{8BB1B34D-E0FC-4804-9098-E7F8E35A749A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Samples.ForkJoinTimerAndSignalHttp", "src\samples\aspnet\Elsa.Samples.ForkJoinTimerAndSignalHttp\Elsa.Samples.ForkJoinTimerAndSignalHttp.csproj", "{8BB1B34D-E0FC-4804-9098-E7F8E35A749A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.HelloWorldHttp", "src\samples\aspnet\Elsa.Samples.HelloWorldHttp\Elsa.Samples.HelloWorldHttp.csproj", "{15FDEF59-32F8-4F8F-AE10-B3D0FEE03049}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Samples.HelloWorldHttp", "src\samples\aspnet\Elsa.Samples.HelloWorldHttp\Elsa.Samples.HelloWorldHttp.csproj", "{15FDEF59-32F8-4F8F-AE10-B3D0FEE03049}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.ReadModelHttp", "src\samples\aspnet\Elsa.Samples.ReadModelHttp\Elsa.Samples.ReadModelHttp.csproj", "{795FF94C-F22C-45A3-9643-88EED173D6D4}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Samples.ReadModelHttp", "src\samples\aspnet\Elsa.Samples.ReadModelHttp\Elsa.Samples.ReadModelHttp.csproj", "{795FF94C-F22C-45A3-9643-88EED173D6D4}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.DeclarativeCompositeActivitiesConsole", "src\samples\console\Elsa.Samples.DeclarativeCompositeActivitiesConsole\Elsa.Samples.DeclarativeCompositeActivitiesConsole.csproj", "{7EC9B4E1-820E-4D53-B4E2-9815E31C7AE8}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Samples.DeclarativeCompositeActivitiesConsole", "src\samples\console\Elsa.Samples.DeclarativeCompositeActivitiesConsole\Elsa.Samples.DeclarativeCompositeActivitiesConsole.csproj", "{7EC9B4E1-820E-4D53-B4E2-9815E31C7AE8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.FileBasedWorkflow", "src\samples\console\Elsa.Samples.FileBasedWorkflow\Elsa.Samples.FileBasedWorkflow.csproj", "{C6A54F89-271D-402E-A38D-6C3A9DB7DF9C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Samples.FileBasedWorkflow", "src\samples\console\Elsa.Samples.FileBasedWorkflow\Elsa.Samples.FileBasedWorkflow.csproj", "{C6A54F89-271D-402E-A38D-6C3A9DB7DF9C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.ForLoopConsole", "src\samples\console\Elsa.Samples.ForLoopConsole\Elsa.Samples.ForLoopConsole.csproj", "{F5124847-D046-4458-A89D-CD796FEDEE1A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Samples.ForLoopConsole", "src\samples\console\Elsa.Samples.ForLoopConsole\Elsa.Samples.ForLoopConsole.csproj", "{F5124847-D046-4458-A89D-CD796FEDEE1A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.GoBackConsole", "src\samples\console\Elsa.Samples.GoBackConsole\Elsa.Samples.GoBackConsole.csproj", "{0B147307-64FF-4496-9DC9-8F83013AC045}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Samples.GoBackConsole", "src\samples\console\Elsa.Samples.GoBackConsole\Elsa.Samples.GoBackConsole.csproj", "{0B147307-64FF-4496-9DC9-8F83013AC045}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.HelloWorldConsole", "src\samples\console\Elsa.Samples.HelloWorldConsole\Elsa.Samples.HelloWorldConsole.csproj", "{935888CF-E871-42BB-A47D-5E1168269A03}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Samples.HelloWorldConsole", "src\samples\console\Elsa.Samples.HelloWorldConsole\Elsa.Samples.HelloWorldConsole.csproj", "{935888CF-E871-42BB-A47D-5E1168269A03}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.IfElseConsole", "src\samples\console\Elsa.Samples.IfElseConsole\Elsa.Samples.IfElseConsole.csproj", "{EA1D7E39-D77D-4B13-BAD0-76BA30547019}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Samples.IfElseConsole", "src\samples\console\Elsa.Samples.IfElseConsole\Elsa.Samples.IfElseConsole.csproj", "{EA1D7E39-D77D-4B13-BAD0-76BA30547019}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.ProgrammaticCompositeActivitiesConsole", "src\samples\console\Elsa.Samples.ProgrammaticCompositeActivitiesConsole\Elsa.Samples.ProgrammaticCompositeActivitiesConsole.csproj", "{0FC36CEC-35B3-4EB7-9DD7-0F2A1C4E9313}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Samples.ProgrammaticCompositeActivitiesConsole", "src\samples\console\Elsa.Samples.ProgrammaticCompositeActivitiesConsole\Elsa.Samples.ProgrammaticCompositeActivitiesConsole.csproj", "{0FC36CEC-35B3-4EB7-9DD7-0F2A1C4E9313}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.ReadLineEchoConsole", "src\samples\console\Elsa.Samples.ReadLineEchoConsole\Elsa.Samples.ReadLineEchoConsole.csproj", "{E7BAECCC-CBF8-4975-93C4-6D3A8F94B000}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Samples.ReadLineEchoConsole", "src\samples\console\Elsa.Samples.ReadLineEchoConsole\Elsa.Samples.ReadLineEchoConsole.csproj", "{E7BAECCC-CBF8-4975-93C4-6D3A8F94B000}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.Serialization", "src\samples\console\Elsa.Samples.Serialization\Elsa.Samples.Serialization.csproj", "{823EB953-0B26-4D85-9B3F-14FCB476E987}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Samples.Serialization", "src\samples\console\Elsa.Samples.Serialization\Elsa.Samples.Serialization.csproj", "{823EB953-0B26-4D85-9B3F-14FCB476E987}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.SignalingConsole", "src\samples\console\Elsa.Samples.SignalingConsole\Elsa.Samples.SignalingConsole.csproj", "{83929B86-434B-4C24-9B02-1F944DF8D71C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Samples.SignalingConsole", "src\samples\console\Elsa.Samples.SignalingConsole\Elsa.Samples.SignalingConsole.csproj", "{83929B86-434B-4C24-9B02-1F944DF8D71C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.WhileLoopConsole", "src\samples\console\Elsa.Samples.WhileLoopConsole\Elsa.Samples.WhileLoopConsole.csproj", "{EDE80D8C-4C1F-44A3-8D0E-6D0757439E1C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Samples.WhileLoopConsole", "src\samples\console\Elsa.Samples.WhileLoopConsole\Elsa.Samples.WhileLoopConsole.csproj", "{EDE80D8C-4C1F-44A3-8D0E-6D0757439E1C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.AzureServiceBusWorker", "src\samples\worker\Elsa.Samples.AzureServiceBusWorker\Elsa.Samples.AzureServiceBusWorker.csproj", "{F958B682-5192-4287-BF80-CB7B30ECFC9E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Samples.AzureServiceBusWorker", "src\samples\worker\Elsa.Samples.AzureServiceBusWorker\Elsa.Samples.AzureServiceBusWorker.csproj", "{F958B682-5192-4287-BF80-CB7B30ECFC9E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.DistributedLock", "src\samples\worker\Elsa.Samples.DistributedLock\Elsa.Samples.DistributedLock.csproj", "{F081EE15-7E1A-4E8C-B91F-5472ED565431}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Samples.DistributedLock", "src\samples\worker\Elsa.Samples.DistributedLock\Elsa.Samples.DistributedLock.csproj", "{F081EE15-7E1A-4E8C-B91F-5472ED565431}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.MultiTenantChildWorker", "src\samples\worker\Elsa.Samples.MultiTenantChildWorker\Elsa.Samples.MultiTenantChildWorker.csproj", "{1053BF2D-BCB6-4616-9773-7FF25F48ECA3}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Samples.MultiTenantChildWorker", "src\samples\worker\Elsa.Samples.MultiTenantChildWorker\Elsa.Samples.MultiTenantChildWorker.csproj", "{1053BF2D-BCB6-4616-9773-7FF25F48ECA3}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.RebusWorker", "src\samples\worker\Elsa.Samples.RebusWorker\Elsa.Samples.RebusWorker.csproj", "{6837DB22-1F5C-42E1-A466-E4597AF6E91E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Samples.RebusWorker", "src\samples\worker\Elsa.Samples.RebusWorker\Elsa.Samples.RebusWorker.csproj", "{6837DB22-1F5C-42E1-A466-E4597AF6E91E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.RunChildWorkflowWorker", "src\samples\worker\Elsa.Samples.RunChildWorkflowWorker\Elsa.Samples.RunChildWorkflowWorker.csproj", "{A4DF29BD-95CC-4A86-96EC-FB6692270E68}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Samples.RunChildWorkflowWorker", "src\samples\worker\Elsa.Samples.RunChildWorkflowWorker\Elsa.Samples.RunChildWorkflowWorker.csproj", "{A4DF29BD-95CC-4A86-96EC-FB6692270E68}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.Timers", "src\samples\worker\Elsa.Samples.Timers\Elsa.Samples.Timers.csproj", "{FD2D1BD0-1229-4DCF-BE70-6BFD396DD489}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Samples.Timers", "src\samples\worker\Elsa.Samples.Timers\Elsa.Samples.Timers.csproj", "{FD2D1BD0-1229-4DCF-BE70-6BFD396DD489}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.WhileLoopWorker", "src\samples\worker\Elsa.Samples.WhileLoopWorker\Elsa.Samples.WhileLoopWorker.csproj", "{EA3832C4-8079-4E84-AF8C-12744E4EFD44}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Samples.WhileLoopWorker", "src\samples\worker\Elsa.Samples.WhileLoopWorker\Elsa.Samples.WhileLoopWorker.csproj", "{EA3832C4-8079-4E84-AF8C-12744E4EFD44}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.CustomAttributesChildWorker", "src\samples\worker\Elsa.Samples.CustomAttributesChildWorker\Elsa.Samples.CustomAttributesChildWorker.csproj", "{AEA00027-F280-43A4-AC60-E2AF3014CF34}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Samples.CustomAttributesChildWorker", "src\samples\worker\Elsa.Samples.CustomAttributesChildWorker\Elsa.Samples.CustomAttributesChildWorker.csproj", "{AEA00027-F280-43A4-AC60-E2AF3014CF34}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.Interrupts", "src\samples\aspnet\Elsa.Samples.Interrupts\Elsa.Samples.Interrupts.csproj", "{E0090EF3-C4A7-4262-9300-1D395BE25DD0}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Samples.Interrupts", "src\samples\aspnet\Elsa.Samples.Interrupts\Elsa.Samples.Interrupts.csproj", "{E0090EF3-C4A7-4262-9300-1D395BE25DD0}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "persistence", "persistence", "{69AE8FC9-D851-42E7-AB27-672F2147C1E3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Persistence.YesSql", "src\persistence\Elsa.Persistence.YesSql\Elsa.Persistence.YesSql.csproj", "{A49EEF61-95EA-4620-8C18-336FC2576A72}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Persistence.InMemory", "src\persistence\Elsa.Persistence.InMemory\Elsa.Persistence.InMemory.csproj", "{C1E1FA38-5284-44A5-9D69-4F42293B7EA0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Persistence.MongoDb", "src\persistence\Elsa.Persistence.MongoDb\Elsa.Persistence.MongoDb.csproj", "{402EE264-5447-42B3-B9C8-A2AAC7E6B1B9}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -238,7 +246,6 @@ Global {E20238CE-5C64-4F87-8753-3B4E1EC9A740}.Debug|Any CPU.Build.0 = Debug|Any CPU {E20238CE-5C64-4F87-8753-3B4E1EC9A740}.Release|Any CPU.ActiveCfg = Release|Any CPU {E20238CE-5C64-4F87-8753-3B4E1EC9A740}.Release|Any CPU.Build.0 = Release|Any CPU - {4CB34AB3-01C9-4911-8914-EABAA744EAD3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4CB34AB3-01C9-4911-8914-EABAA744EAD3}.Debug|Any CPU.Build.0 = Debug|Any CPU {4CB34AB3-01C9-4911-8914-EABAA744EAD3}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -399,6 +406,18 @@ Global {E0090EF3-C4A7-4262-9300-1D395BE25DD0}.Debug|Any CPU.Build.0 = Debug|Any CPU {E0090EF3-C4A7-4262-9300-1D395BE25DD0}.Release|Any CPU.ActiveCfg = Release|Any CPU {E0090EF3-C4A7-4262-9300-1D395BE25DD0}.Release|Any CPU.Build.0 = Release|Any CPU + {A49EEF61-95EA-4620-8C18-336FC2576A72}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A49EEF61-95EA-4620-8C18-336FC2576A72}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A49EEF61-95EA-4620-8C18-336FC2576A72}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A49EEF61-95EA-4620-8C18-336FC2576A72}.Release|Any CPU.Build.0 = Release|Any CPU + {C1E1FA38-5284-44A5-9D69-4F42293B7EA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C1E1FA38-5284-44A5-9D69-4F42293B7EA0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C1E1FA38-5284-44A5-9D69-4F42293B7EA0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C1E1FA38-5284-44A5-9D69-4F42293B7EA0}.Release|Any CPU.Build.0 = Release|Any CPU + {402EE264-5447-42B3-B9C8-A2AAC7E6B1B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {402EE264-5447-42B3-B9C8-A2AAC7E6B1B9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {402EE264-5447-42B3-B9C8-A2AAC7E6B1B9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {402EE264-5447-42B3-B9C8-A2AAC7E6B1B9}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -425,10 +444,10 @@ Global {0A3C36AB-2ACF-4175-A512-66B4C3DB9371} = {AB1AE008-6FD6-414C-8E88-D735F42E1FA6} {0A6747EA-7AC6-4B6F-BC0C-C40C8A80C44D} = {AB1AE008-6FD6-414C-8E88-D735F42E1FA6} {E7C689EB-5AD6-4E91-A007-6116EEA702FC} = {0A6747EA-7AC6-4B6F-BC0C-C40C8A80C44D} - {7CD5C8D5-EC78-4A99-A514-F01CA7197AC8} = {DA71CDAA-8DD3-4D5F-9FBD-8E4B37A2D925} - {E20238CE-5C64-4F87-8753-3B4E1EC9A740} = {7CD5C8D5-EC78-4A99-A514-F01CA7197AC8} - {EBD49CCA-5400-4C36-B5DF-7B28190AA323} = {7CD5C8D5-EC78-4A99-A514-F01CA7197AC8} {150EF356-E8BC-4922-91C2-362017479409} = {7CD5C8D5-EC78-4A99-A514-F01CA7197AC8} + {EBD49CCA-5400-4C36-B5DF-7B28190AA323} = {7CD5C8D5-EC78-4A99-A514-F01CA7197AC8} + {E20238CE-5C64-4F87-8753-3B4E1EC9A740} = {7CD5C8D5-EC78-4A99-A514-F01CA7197AC8} + {7CD5C8D5-EC78-4A99-A514-F01CA7197AC8} = {DA71CDAA-8DD3-4D5F-9FBD-8E4B37A2D925} {4CB34AB3-01C9-4911-8914-EABAA744EAD3} = {0A3C36AB-2ACF-4175-A512-66B4C3DB9371} {FC47A50F-03B2-47D8-AAFB-075314FBA186} = {AB1AE008-6FD6-414C-8E88-D735F42E1FA6} {BB5819C7-434A-4AC5-8B0E-6C4FA672EBD5} = {FC47A50F-03B2-47D8-AAFB-075314FBA186} @@ -477,6 +496,10 @@ Global {EA3832C4-8079-4E84-AF8C-12744E4EFD44} = {E42743A0-FBDD-4150-9D53-6000496D9B87} {AEA00027-F280-43A4-AC60-E2AF3014CF34} = {E42743A0-FBDD-4150-9D53-6000496D9B87} {E0090EF3-C4A7-4262-9300-1D395BE25DD0} = {22E75696-6FE9-436A-9097-EE21C603F818} + {69AE8FC9-D851-42E7-AB27-672F2147C1E3} = {DA71CDAA-8DD3-4D5F-9FBD-8E4B37A2D925} + {A49EEF61-95EA-4620-8C18-336FC2576A72} = {69AE8FC9-D851-42E7-AB27-672F2147C1E3} + {C1E1FA38-5284-44A5-9D69-4F42293B7EA0} = {69AE8FC9-D851-42E7-AB27-672F2147C1E3} + {402EE264-5447-42B3-B9C8-A2AAC7E6B1B9} = {69AE8FC9-D851-42E7-AB27-672F2147C1E3} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {8B0975FD-7050-48B0-88C5-48C33378E158} diff --git a/src/activities/Elsa.Activities.Http/Controllers/HttpWorkflowsController.cs b/src/activities/Elsa.Activities.Http/Controllers/HttpWorkflowsController.cs index 789eeb680..ffe4cb07a 100644 --- a/src/activities/Elsa.Activities.Http/Controllers/HttpWorkflowsController.cs +++ b/src/activities/Elsa.Activities.Http/Controllers/HttpWorkflowsController.cs @@ -2,7 +2,7 @@ using System.Threading; using System.Threading.Tasks; using Elsa.Activities.Http.Models; using Elsa.Activities.Http.Services; -using Elsa.Extensions; +using Elsa.Repositories; using Elsa.Services; using Microsoft.AspNetCore.Mvc; @@ -14,16 +14,16 @@ namespace Elsa.Activities.Http.Controllers { private readonly ITokenService _tokenService; private readonly IWorkflowRunner _workflowRunner; - private readonly IWorkflowInstanceManager _workflowInstanceManager; + private readonly IWorkflowInstanceRepository _workflowInstanceManager; public HttpWorkflowsController( ITokenService tokenService, IWorkflowRunner workflowRunner, - IWorkflowInstanceManager workflowInstanceManager) + IWorkflowInstanceRepository workflowInstanceRepository) { _tokenService = tokenService; _workflowRunner = workflowRunner; - _workflowInstanceManager = workflowInstanceManager; + _workflowInstanceManager = workflowInstanceRepository; } [Route("trigger/{token}")] diff --git a/src/activities/Elsa.Activities.Http/Middleware/HttpRequestMiddleware.cs b/src/activities/Elsa.Activities.Http/Middleware/HttpRequestMiddleware.cs index a67b74e50..627fe92b5 100644 --- a/src/activities/Elsa.Activities.Http/Middleware/HttpRequestMiddleware.cs +++ b/src/activities/Elsa.Activities.Http/Middleware/HttpRequestMiddleware.cs @@ -3,7 +3,7 @@ using System.Net; using System.Threading.Tasks; using Elsa.Activities.Http.Extensions; using Elsa.Activities.Http.Triggers; -using Elsa.Extensions; +using Elsa.Repositories; using Elsa.Services; using Elsa.Triggers; using Microsoft.AspNetCore.Http; @@ -20,7 +20,7 @@ namespace Elsa.Activities.Http.Middleware _next = next; } - public async Task InvokeAsync(HttpContext httpContext, IWorkflowSelector workflowSelector, IWorkflowRunner workflowRunner, IWorkflowInstanceManager workflowInstanceManager) + public async Task InvokeAsync(HttpContext httpContext, IWorkflowSelector workflowSelector, IWorkflowRunner workflowRunner, IWorkflowInstanceRepository workflowInstanceRepository) { var path = httpContext.Request.Path; var method = httpContext.Request.Method; @@ -53,7 +53,7 @@ namespace Elsa.Activities.Http.Middleware } else { - var workflowInstance = await workflowInstanceManager.GetByIdAsync(result.WorkflowInstanceId, cancellationToken); + var workflowInstance = await workflowInstanceRepository.GetByIdAsync(result.WorkflowInstanceId, cancellationToken); if (workflowInstance == null) { diff --git a/src/activities/Elsa.Activities.Http/RequestHandlers/Handlers/SignalRequestHandler.cs b/src/activities/Elsa.Activities.Http/RequestHandlers/Handlers/SignalRequestHandler.cs index 3b19a20b3..458ba0f1c 100644 --- a/src/activities/Elsa.Activities.Http/RequestHandlers/Handlers/SignalRequestHandler.cs +++ b/src/activities/Elsa.Activities.Http/RequestHandlers/Handlers/SignalRequestHandler.cs @@ -5,6 +5,7 @@ using Elsa.Activities.Http.RequestHandlers.Results; using Elsa.Activities.Http.Services; using Elsa.Extensions; using Elsa.Models; +using Elsa.Repositories; using Elsa.Services; using Microsoft.AspNetCore.Http; @@ -13,19 +14,19 @@ namespace Elsa.Activities.Http.RequestHandlers.Handlers public class SignalRequestHandler : IRequestHandler { private readonly HttpContext _httpContext; - private readonly IWorkflowInstanceManager _workflowInstanceManager; + private readonly IWorkflowInstanceRepository _workflowInstanceManager; private readonly ITokenService _tokenService; private readonly CancellationToken _cancellationToken; private readonly IWorkflowRunner _workflowRunner; public SignalRequestHandler( - IWorkflowInstanceManager workflowInstanceManager, + IWorkflowInstanceRepository workflowInstanceRepository, IHttpContextAccessor httpContextAccessor, ITokenService tokenService, IWorkflowRunner workflowRunner) { _httpContext = httpContextAccessor.HttpContext; - _workflowInstanceManager = workflowInstanceManager; + _workflowInstanceManager = workflowInstanceRepository; _tokenService = tokenService; _workflowRunner = workflowRunner; _cancellationToken = _httpContext.RequestAborted; diff --git a/src/activities/Elsa.Activities.Timers/Activities/Cron/Cron.cs b/src/activities/Elsa.Activities.Timers/Activities/Cron/Cron.cs index bf64292cb..f98c20967 100644 --- a/src/activities/Elsa.Activities.Timers/Activities/Cron/Cron.cs +++ b/src/activities/Elsa.Activities.Timers/Activities/Cron/Cron.cs @@ -2,6 +2,7 @@ using System.Threading.Tasks; using Elsa.Activities.Timers.Services; using Elsa.ActivityResults; using Elsa.Attributes; +using Elsa.Repositories; using Elsa.Services; using Elsa.Services.Models; using NodaTime; @@ -17,13 +18,13 @@ namespace Elsa.Activities.Timers public class Cron : Activity { private readonly IClock _clock; - private readonly IWorkflowInstanceManager _workflowInstanceManager; + private readonly IWorkflowInstanceRepository _workflowInstanceManager; private readonly IWorkflowScheduler _workflowScheduler; - public Cron(IClock clock, IWorkflowInstanceManager workflowInstanceManager, IWorkflowScheduler workflowScheduler) + public Cron(IClock clock, IWorkflowInstanceRepository workflowInstanceRepository, IWorkflowScheduler workflowScheduler) { _clock = clock; - _workflowInstanceManager = workflowInstanceManager; + _workflowInstanceManager = workflowInstanceRepository; _workflowScheduler = workflowScheduler; } diff --git a/src/activities/Elsa.Activities.Timers/Activities/StartAt/StartAt.cs b/src/activities/Elsa.Activities.Timers/Activities/StartAt/StartAt.cs index 138cd1a9d..02515c5eb 100644 --- a/src/activities/Elsa.Activities.Timers/Activities/StartAt/StartAt.cs +++ b/src/activities/Elsa.Activities.Timers/Activities/StartAt/StartAt.cs @@ -2,6 +2,7 @@ using System.Threading.Tasks; using Elsa.Activities.Timers.Services; using Elsa.ActivityResults; using Elsa.Attributes; +using Elsa.Repositories; using Elsa.Services; using Elsa.Services.Models; using NodaTime; @@ -18,12 +19,12 @@ namespace Elsa.Activities.Timers )] public class StartAt : Activity { - private readonly IWorkflowInstanceManager _workflowInstanceManager; + private readonly IWorkflowInstanceRepository _workflowInstanceManager; private readonly IWorkflowScheduler _workflowScheduler; - public StartAt(IWorkflowInstanceManager workflowInstanceManager, IWorkflowScheduler workflowScheduler) + public StartAt(IWorkflowInstanceRepository workflowInstanceRepository, IWorkflowScheduler workflowScheduler) { - _workflowInstanceManager = workflowInstanceManager; + _workflowInstanceManager = workflowInstanceRepository; _workflowScheduler = workflowScheduler; } diff --git a/src/activities/Elsa.Activities.Timers/ActivityResults/ScheduleWorkflowResult.cs b/src/activities/Elsa.Activities.Timers/ActivityResults/ScheduleWorkflowResult.cs index 8aaf78ab9..32df8903b 100644 --- a/src/activities/Elsa.Activities.Timers/ActivityResults/ScheduleWorkflowResult.cs +++ b/src/activities/Elsa.Activities.Timers/ActivityResults/ScheduleWorkflowResult.cs @@ -1,8 +1,9 @@ -using System.Threading; +using System.Threading; using System.Threading.Tasks; using Elsa.Activities.Timers.Services; using Elsa.ActivityResults; using Elsa.Models; +using Elsa.Repositories; using Elsa.Services; using Elsa.Services.Models; using NodaTime; @@ -21,9 +22,9 @@ namespace Elsa.Activities.Timers.ActivityResults public override async ValueTask ExecuteAsync(ActivityExecutionContext activityExecutionContext, CancellationToken cancellationToken) { var workflowInstance = activityExecutionContext.WorkflowExecutionContext.WorkflowInstance; - var workflowInstanceManager = activityExecutionContext.GetService(); + var workflowInstanceRepository = activityExecutionContext.GetService(); var scheduler = activityExecutionContext.GetService(); - await workflowInstanceManager.SaveAsync(workflowInstance, cancellationToken); + await workflowInstanceRepository.SaveAsync(workflowInstance, cancellationToken); await scheduler.ScheduleWorkflowAsync(activityExecutionContext.WorkflowExecutionContext.WorkflowBlueprint, workflowInstance.WorkflowInstanceId, activityExecutionContext.ActivityInstance.Id, ExecuteAt, cancellationToken); } } diff --git a/src/activities/Elsa.Activities.Timers/Jobs/RunWorkflowJob.cs b/src/activities/Elsa.Activities.Timers/Jobs/RunWorkflowJob.cs index 2a46dfc92..428794fe6 100644 --- a/src/activities/Elsa.Activities.Timers/Jobs/RunWorkflowJob.cs +++ b/src/activities/Elsa.Activities.Timers/Jobs/RunWorkflowJob.cs @@ -1,10 +1,10 @@ -using System; +using System; using System.Linq.Expressions; using System.Threading; using System.Threading.Tasks; using Elsa.Extensions; -using Elsa.Indexes; using Elsa.Models; +using Elsa.Repositories; using Elsa.Services; using Microsoft.Extensions.Logging; using Quartz; @@ -15,14 +15,14 @@ namespace Elsa.Activities.Timers.Jobs { private readonly IWorkflowRunner _workflowRunner; private readonly IWorkflowRegistry _workflowRegistry; - private readonly IWorkflowInstanceManager _workflowInstanceManager; + private readonly IWorkflowInstanceRepository _workflowInstanceManager; private readonly ILogger _logger; - public RunWorkflowJob(IWorkflowRunner workflowRunner, IWorkflowRegistry workflowRegistry, IWorkflowInstanceManager workflowInstanceManager, ILogger logger) + public RunWorkflowJob(IWorkflowRunner workflowRunner, IWorkflowRegistry workflowRegistry, IWorkflowInstanceRepository workflowInstanceRepository, ILogger logger) { _workflowRunner = workflowRunner; _workflowRegistry = workflowRegistry; - _workflowInstanceManager = workflowInstanceManager; + _workflowInstanceManager = workflowInstanceRepository; _logger = logger; } @@ -38,7 +38,7 @@ namespace Elsa.Activities.Timers.Jobs if (workflowInstanceId == null) { - if (workflowBlueprint.IsSingleton && await GetWorkflowIsAlreadyExecutingAsync(tenantId, workflowDefinitionId, cancellationToken)) + if (workflowBlueprint.IsSingleton && await _workflowInstanceManager.IsWorkflowIsAlreadyExecutingAsync(tenantId, workflowDefinitionId, cancellationToken)) return; await _workflowRunner.RunWorkflowAsync(workflowBlueprint, activityId, cancellationToken: cancellationToken); @@ -60,16 +60,5 @@ namespace Elsa.Activities.Timers.Jobs await _workflowRunner.RunWorkflowAsync(workflowBlueprint, workflowInstance!, activityId, cancellationToken: cancellationToken); } } - - private async Task GetWorkflowIsAlreadyExecutingAsync(string? tenantId, string workflowDefinitionId, CancellationToken cancellationToken) - { - Expression> query = index => - index.WorkflowDefinitionId == workflowDefinitionId - && index.TenantId == tenantId - && (index.WorkflowStatus == WorkflowStatus.Running || index.WorkflowStatus == WorkflowStatus.Suspended); - - var workflowInstance = await _workflowInstanceManager.Query(query).FirstOrDefaultAsync(); - return workflowInstance != null; - } } } \ No newline at end of file diff --git a/src/core/Elsa.Abstractions/Elsa.Abstractions.csproj b/src/core/Elsa.Abstractions/Elsa.Abstractions.csproj index a98672c66..4b80bd029 100644 --- a/src/core/Elsa.Abstractions/Elsa.Abstractions.csproj +++ b/src/core/Elsa.Abstractions/Elsa.Abstractions.csproj @@ -1,4 +1,4 @@ - + netstandard2.0 @@ -40,7 +40,6 @@ - diff --git a/src/core/Elsa.Abstractions/Extensions/IWorkflowInstanceRepositoryExtensions.cs b/src/core/Elsa.Abstractions/Extensions/IWorkflowInstanceRepositoryExtensions.cs new file mode 100644 index 000000000..1279e4719 --- /dev/null +++ b/src/core/Elsa.Abstractions/Extensions/IWorkflowInstanceRepositoryExtensions.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +using Elsa.Models; +using Elsa.Repositories; + +namespace Elsa.Extensions +{ + public static class IWorkflowInstanceRepositoryExtensions + { + public static Task> ListByDefinitionAndStatusAsync( + this IWorkflowInstanceRepository manager, + string workflowDefinitionId, + WorkflowStatus workflowStatus, + CancellationToken cancellationToken = default) => + manager.ListByDefinitionAndStatusAsync(workflowDefinitionId, default, workflowStatus, cancellationToken); + + public static Task> ListByDefinitionAsync( + this IWorkflowInstanceRepository manager, + string workflowDefinitionId, + CancellationToken cancellationToken = default) => + manager.ListByDefinitionAsync(workflowDefinitionId, default, cancellationToken); + } +} diff --git a/src/core/Elsa.Abstractions/Extensions/ServiceCollectionExtensions.cs b/src/core/Elsa.Abstractions/Extensions/ServiceCollectionExtensions.cs index ed43aa0c4..cc8c58b4a 100644 --- a/src/core/Elsa.Abstractions/Extensions/ServiceCollectionExtensions.cs +++ b/src/core/Elsa.Abstractions/Extensions/ServiceCollectionExtensions.cs @@ -1,16 +1,12 @@ -using Elsa.Data; +using Elsa.Data; using Elsa.Services; using Elsa.Triggers; -using YesSql.Indexes; // ReSharper disable once CheckNamespace namespace Microsoft.Extensions.DependencyInjection { public static class ServiceCollectionExtensions - { - public static IServiceCollection AddIndexProvider(this IServiceCollection services) where T : class, IIndexProvider => services.AddSingleton(); - public static IServiceCollection AddScopedIndexProvider(this IServiceCollection services) where T : class, IIndexProvider => services.AddScoped(); - public static IServiceCollection AddDataMigration(this IServiceCollection services) where T : class, IDataMigration => services.AddScoped(); + { public static IServiceCollection AddWorkflowProvider(this IServiceCollection services) where T : class, IWorkflowProvider => services.AddTransient(); public static IServiceCollection AddTriggerProvider(this IServiceCollection services) where T : class, ITriggerProvider => services.AddTransient(); public static IServiceCollection AddWorkflowContextProvider(this IServiceCollection services) where T : class, IWorkflowContextProvider => services.AddTransient(); diff --git a/src/core/Elsa.Abstractions/Services/IWorkflowDefinitionManager.cs b/src/core/Elsa.Abstractions/Repositories/IWorkflowDefinitionRepository.cs similarity index 57% rename from src/core/Elsa.Abstractions/Services/IWorkflowDefinitionManager.cs rename to src/core/Elsa.Abstractions/Repositories/IWorkflowDefinitionRepository.cs index 189e9be8b..ff3143289 100644 --- a/src/core/Elsa.Abstractions/Services/IWorkflowDefinitionManager.cs +++ b/src/core/Elsa.Abstractions/Repositories/IWorkflowDefinitionRepository.cs @@ -1,27 +1,20 @@ -using System; using System.Collections.Generic; -using System.Linq.Expressions; using System.Threading; using System.Threading.Tasks; -using Elsa.Models; -using YesSql; -using YesSql.Indexes; -namespace Elsa.Services +using Elsa.Models; + +namespace Elsa.Repositories { - public interface IWorkflowDefinitionManager + public interface IWorkflowDefinitionRepository { + Task SaveAsync(WorkflowDefinition workflowDefinition, CancellationToken cancellationToken = default); Task DeleteAsync(WorkflowDefinition workflowDefinition, CancellationToken cancellationToken = default); Task CountAsync(VersionOptions? version = default, CancellationToken cancellationToken = default); Task> ListAsync(int? skip = default, int? take = default, VersionOptions? version = default, CancellationToken cancellationToken = default); - IQuery Query(); - IQuery Query() where TIndex : class, IIndex; - - IQuery Query(Expression> predicate) - where TIndex : class, IIndex; - - IQuery ExecuteQuery(ICompiledQuery query); + Task GetAsync(string workflowDefinitionId, VersionOptions version, CancellationToken cancellationToken = default); + Task GetByVersionIdAsync(string workflowDefinitionVersionId, CancellationToken cancellationToken = default); WorkflowDefinition Initialize(WorkflowDefinition workflowDefinition); } -} \ No newline at end of file +} diff --git a/src/core/Elsa.Abstractions/Repositories/IWorkflowDefinitionRepositoryExtensions.cs b/src/core/Elsa.Abstractions/Repositories/IWorkflowDefinitionRepositoryExtensions.cs new file mode 100644 index 000000000..34190ccbb --- /dev/null +++ b/src/core/Elsa.Abstractions/Repositories/IWorkflowDefinitionRepositoryExtensions.cs @@ -0,0 +1,46 @@ +using System.Collections.Generic; +using System.Linq; + +using Elsa.Models; + +namespace Elsa.Repositories +{ + public static class IWorkflowDefinitionRepositoryExtensions + { + public static IEnumerable WithVersion(this IEnumerable query, VersionOptions? version = default) + { + var versionOption = version ?? VersionOptions.Latest; + + if (versionOption.IsDraft) + return query.Where(x => !x.IsPublished); + else if (versionOption.IsLatest) + return query.Where(x => x.IsLatest); + else if (versionOption.IsPublished) + return query.Where(x => x.IsPublished); + else if (versionOption.IsLatestOrPublished) + return query.Where(x => x.IsPublished || x.IsLatest); + else if (versionOption.Version > 0) + return query.Where(x => x.Version == versionOption.Version); + + return query; + } + + public static IQueryable WithVersion(this IQueryable query, VersionOptions? version = default) + { + var versionOption = version ?? VersionOptions.Latest; + + if (versionOption.IsDraft) + return query.Where(x => !x.IsPublished); + else if (versionOption.IsLatest) + return query.Where(x => x.IsLatest); + else if (versionOption.IsPublished) + return query.Where(x => x.IsPublished); + else if (versionOption.IsLatestOrPublished) + return query.Where(x => x.IsPublished || x.IsLatest); + else if (versionOption.Version > 0) + return query.Where(x => x.Version == versionOption.Version); + + return query; + } + } +} diff --git a/src/core/Elsa.Abstractions/Repositories/IWorkflowInstanceRepository.cs b/src/core/Elsa.Abstractions/Repositories/IWorkflowInstanceRepository.cs new file mode 100644 index 000000000..785264c85 --- /dev/null +++ b/src/core/Elsa.Abstractions/Repositories/IWorkflowInstanceRepository.cs @@ -0,0 +1,35 @@ +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +using Elsa.Models; + + +namespace Elsa.Repositories +{ + public interface IWorkflowInstanceRepository + { + Task SaveAsync(WorkflowInstance workflowInstance, CancellationToken cancellationToken = default); + Task DeleteAsync(WorkflowInstance workflowInstance, CancellationToken cancellationToken = default); + + Task IsWorkflowIsAlreadyExecutingAsync(string? tenantId, string workflowDefinitionId, CancellationToken cancellationToken = default); + + Task GetByIdAsync(string workflowInstanceId, CancellationToken cancellationToken = default); + + Task> ListAsync(int page, int pageSize, CancellationToken cancellationToken = default); + + Task> ListByBlockingActivityTypeAsync(string activityType, CancellationToken cancellationToken = default); + + Task> ListByDefinitionAndStatusAsync(string workflowDefinitionId, string? tenantId, WorkflowStatus workflowStatus, CancellationToken cancellationToken = default); + + Task> ListByStatusAsync(WorkflowStatus workflowStatus, CancellationToken cancellationToken = default); + + Task> ListByDefinitionAsync(string workflowDefinitionId,string? tenantId,CancellationToken cancellationToken = default); + + Task GetByCorrelationIdAsync(string correlationId, WorkflowStatus status,CancellationToken cancellationToken = default); + + Task> ListByCorrelationIdAsync(string correlationId,WorkflowStatus status,CancellationToken cancellationToken = default); + Task CountAsync(CancellationToken cancellationToken = default); + + } +} \ No newline at end of file diff --git a/src/core/Elsa.Abstractions/Services/IWorkflowInstanceManager.cs b/src/core/Elsa.Abstractions/Services/IWorkflowInstanceManager.cs deleted file mode 100644 index 16d79fa5a..000000000 --- a/src/core/Elsa.Abstractions/Services/IWorkflowInstanceManager.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Linq.Expressions; -using System.Threading; -using System.Threading.Tasks; -using Elsa.Models; -using YesSql; -using YesSql.Indexes; - -namespace Elsa.Services -{ - public interface IWorkflowInstanceManager - { - ValueTask SaveAsync(WorkflowInstance workflowInstance, CancellationToken cancellationToken = default); - ValueTask DeleteAsync(WorkflowInstance workflowInstance, CancellationToken cancellationToken = default); - IQuery Query() where TIndex : class, IIndex; - IQuery Query(Expression> predicate) where TIndex : class, IIndex; - } -} \ No newline at end of file diff --git a/src/core/Elsa.Core/Activities/Signaling/Activities/InterruptTrigger/InterruptTrigger.cs b/src/core/Elsa.Core/Activities/Signaling/Activities/InterruptTrigger/InterruptTrigger.cs index 96d3f1d0c..83c366815 100644 --- a/src/core/Elsa.Core/Activities/Signaling/Activities/InterruptTrigger/InterruptTrigger.cs +++ b/src/core/Elsa.Core/Activities/Signaling/Activities/InterruptTrigger/InterruptTrigger.cs @@ -1,7 +1,7 @@ using System.Threading.Tasks; using Elsa.ActivityResults; using Elsa.Attributes; -using Elsa.Extensions; +using Elsa.Repositories; using Elsa.Services; using Elsa.Services.Models; @@ -19,12 +19,12 @@ namespace Elsa.Activities.Signaling public class InterruptTrigger : Activity { private readonly IWorkflowTriggerInterruptor _workflowTriggerInterruptor; - private readonly IWorkflowInstanceManager _workflowInstanceManager; + private readonly IWorkflowInstanceRepository _workflowInstanceManager; - public InterruptTrigger(IWorkflowTriggerInterruptor workflowTriggerInterruptor, IWorkflowInstanceManager workflowInstanceManager) + public InterruptTrigger(IWorkflowTriggerInterruptor workflowTriggerInterruptor, IWorkflowInstanceRepository workflowInstanceRepository) { _workflowTriggerInterruptor = workflowTriggerInterruptor; - _workflowInstanceManager = workflowInstanceManager; + _workflowInstanceManager = workflowInstanceRepository; } [ActivityProperty(Hint = "The ID of the workflow instance to resume.")] diff --git a/src/core/Elsa.Core/Consumers/RunWorkflowConsumer.cs b/src/core/Elsa.Core/Consumers/RunWorkflowConsumer.cs index 29e537044..bde177890 100644 --- a/src/core/Elsa.Core/Consumers/RunWorkflowConsumer.cs +++ b/src/core/Elsa.Core/Consumers/RunWorkflowConsumer.cs @@ -1,7 +1,7 @@ using System.Threading.Tasks; using Elsa.Exceptions; -using Elsa.Extensions; using Elsa.Messages; +using Elsa.Repositories; using Elsa.Services; using Rebus.Handlers; @@ -10,12 +10,12 @@ namespace Elsa.Consumers public class RunWorkflowConsumer : IHandleMessages { private readonly IWorkflowRunner _workflowRunner; - private readonly IWorkflowInstanceManager _workflowInstanceManager; + private readonly IWorkflowInstanceRepository _workflowInstanceManager; - public RunWorkflowConsumer(IWorkflowRunner workflowRunner, IWorkflowInstanceManager workflowInstanceManager) + public RunWorkflowConsumer(IWorkflowRunner workflowRunner, IWorkflowInstanceRepository workflowInstanceRepository) { _workflowRunner = workflowRunner; - _workflowInstanceManager = workflowInstanceManager; + _workflowInstanceManager = workflowInstanceRepository; } public async Task Handle(RunWorkflow message) diff --git a/src/core/Elsa.Core/Data/Extensions/PersistenceServiceCollectionExtensions.cs b/src/core/Elsa.Core/Data/Extensions/PersistenceServiceCollectionExtensions.cs deleted file mode 100644 index 32291c615..000000000 --- a/src/core/Elsa.Core/Data/Extensions/PersistenceServiceCollectionExtensions.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System; -using System.Linq; -using Elsa.Data.Services; -using Elsa.Runtime; -using Elsa.WorkflowProviders; -using Microsoft.Extensions.DependencyInjection; -using YesSql; -using YesSql.Indexes; -using ISession = YesSql.ISession; - -namespace Elsa.Data.Extensions -{ - public static class PersistenceServiceCollectionExtensions - { - public static IServiceCollection AddPersistence( - this IServiceCollection services, - Action configure) - { - services - .AddWorkflowProvider() - .AddSingleton(sp => CreateStore(sp, configure)) - .AddScoped(CreateSession) - .AddScoped() - .AddStartupTask() - .AddStartupTask() - .AddDataMigration(); - - return services; - } - - private static IStore CreateStore( - IServiceProvider serviceProvider, - Action configure) - { - var configuration = new Configuration { ContentSerializer = new CustomJsonContentSerializer() }; - configure(serviceProvider, configuration); - - // TODO: The following line is a temporary workaround until the bug in YesSql is fixed: https://github.com/sebastienros/yessql/pull/280 - var store = StoreFactory.CreateAndInitializeAsync(configuration).GetAwaiter().GetResult(); - //var store = StoreFactory.Create(configuration); - - var indexes = serviceProvider.GetServices(); - store.RegisterIndexes(indexes); - - return store; - } - - private static ISession CreateSession(IServiceProvider serviceProvider) - { - var store = serviceProvider.GetRequiredService(); - var session = store.CreateSession(); - var scopedServices = serviceProvider.GetServices().Cast().ToArray(); - - session.RegisterIndexes(scopedServices); - - return session; - } - } -} \ No newline at end of file diff --git a/src/core/Elsa.Core/Elsa.Core.csproj b/src/core/Elsa.Core/Elsa.Core.csproj index 667072322..253738f46 100644 --- a/src/core/Elsa.Core/Elsa.Core.csproj +++ b/src/core/Elsa.Core/Elsa.Core.csproj @@ -1,4 +1,4 @@ - + netstandard2.0 @@ -51,7 +51,6 @@ - diff --git a/src/core/Elsa.Core/ElsaOptions.cs b/src/core/Elsa.Core/ElsaOptions.cs index a07441b90..ba37ae084 100644 --- a/src/core/Elsa.Core/ElsaOptions.cs +++ b/src/core/Elsa.Core/ElsaOptions.cs @@ -12,10 +12,8 @@ using Rebus.Logging; using Rebus.Persistence.InMem; using Rebus.Routing.TypeBased; using Rebus.Transport.InMem; -using YesSql; using Storage.Net; using Storage.Net.Blobs; -using YesSql.Provider.Sqlite; namespace Elsa { @@ -25,7 +23,6 @@ namespace Elsa { Services = services; - ConfigurePersistence = (sp, config) => config.UseSqLite("Data Source=elsa.db;Cache=Shared", IsolationLevel.ReadUncommitted); StorageFactory = sp => Storage.Net.StorageFactory.Blobs.InMemory(); DistributedLockProviderFactory = sp => new DefaultLockProvider(); SignalFactory = sp => new Signal(); @@ -52,7 +49,6 @@ namespace Elsa } public IServiceCollection Services { get; } - internal Action ConfigurePersistence { get; set; } internal Func StorageFactory { get; set; } internal Func DistributedLockProviderFactory { get; private set; } internal Func SignalFactory { get; private set; } @@ -73,14 +69,6 @@ namespace Elsa return this; } - public ElsaOptions UsePersistence(Action configure) => UsePersistence((sp, config) => configure(config)); - - public ElsaOptions UsePersistence(Action configure) - { - ConfigurePersistence = configure; - return this; - } - public ElsaOptions UseStorage(Func factory) => UseStorage(_ => factory()); public ElsaOptions UseStorage(Func factory) diff --git a/src/core/Elsa.Core/Extensions/ElsaServiceCollectionExtensions.cs b/src/core/Elsa.Core/Extensions/ElsaServiceCollectionExtensions.cs index 97932b10f..3a56b8ae4 100644 --- a/src/core/Elsa.Core/Extensions/ElsaServiceCollectionExtensions.cs +++ b/src/core/Elsa.Core/Extensions/ElsaServiceCollectionExtensions.cs @@ -10,11 +10,9 @@ using Elsa.ActivityTypeProviders; using Elsa.Builders; using Elsa.Consumers; using Elsa.Converters; -using Elsa.Data.Extensions; using Elsa.Expressions; using Elsa.Extensions; using Elsa.HostedServices; -using Elsa.Indexes; using Elsa.Mapping; using Elsa.Metadata; using Elsa.Metadata.Handlers; @@ -44,8 +42,7 @@ namespace Microsoft.Extensions.DependencyInjection .AddSingleton(options) .AddSingleton(options.DistributedLockProviderFactory) .AddSingleton(options.SignalFactory) - .AddSingleton(options.StorageFactory) - .AddPersistence(options.ConfigurePersistence); + .AddSingleton(options.StorageFactory); options.AddWorkflowsCore(); options.AddMediatR(); @@ -100,12 +97,8 @@ namespace Microsoft.Extensions.DependencyInjection .AddSingleton() .AddSingleton() .AddScoped() - .AddScoped() - .AddScoped() .AddScoped() - .AddScoped() - .AddIndexProvider() - .AddIndexProvider() + .AddScoped() .AddStartupRunner() .AddSingleton() .AddSingleton() diff --git a/src/core/Elsa.Core/Extensions/WorkflowDefinitionExtensions.cs b/src/core/Elsa.Core/Extensions/WorkflowDefinitionExtensions.cs deleted file mode 100644 index 3674b1328..000000000 --- a/src/core/Elsa.Core/Extensions/WorkflowDefinitionExtensions.cs +++ /dev/null @@ -1,64 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using Elsa.Indexes; -using Elsa.Models; -using YesSql; - -namespace Elsa.Extensions -{ - public static class WorkflowDefinitionExtensions - { - public static IEnumerable WithVersion( - this IEnumerable query, - VersionOptions version) - { - return query.AsQueryable().WithVersion(version); - } - - public static IQueryable WithVersion( - this IQueryable query, - VersionOptions version) - { - if (version.IsDraft) - query = query.Where(x => !x.IsPublished); - else if (version.IsLatest) - query = query.Where(x => x.IsLatest); - else if (version.IsPublished) - query = query.Where(x => x.IsPublished); - else if (version.IsLatestOrPublished) - query = query.Where(x => x.IsPublished || x.IsLatest); - else if (version.AllVersions) - { - // Nothing to filter. - } - else if (version.Version > 0) - query = query.Where(x => x.Version == version.Version); - - return query.OrderByDescending(x => x.Version); - } - - public static IQuery WithVersion( - this IQuery query, - VersionOptions version) - { - var index = query.With(); - - if (version.IsDraft) - query = index.Where(x => !x.IsPublished); - else if (version.IsLatest) - query = index.Where(x => x.IsLatest); - else if (version.IsPublished) - query = index.Where(x => x.IsPublished); - else if (version.IsLatestOrPublished) - query = index.Where(x => x.IsPublished || x.IsLatest); - else if (version.AllVersions) - { - // Nothing to filter. - } - else if (version.Version > 0) - query = index.Where(x => x.Version == version.Version); - - return index.OrderByDescending(x => x.Version); - } - } -} \ No newline at end of file diff --git a/src/core/Elsa.Core/Extensions/WorkflowDefinitionManagerExtensions.cs b/src/core/Elsa.Core/Extensions/WorkflowDefinitionManagerExtensions.cs deleted file mode 100644 index 8b17af40d..000000000 --- a/src/core/Elsa.Core/Extensions/WorkflowDefinitionManagerExtensions.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Elsa.Indexes; -using Elsa.Models; -using Elsa.Services; -using YesSql; - -namespace Elsa.Extensions -{ - public static class WorkflowDefinitionManagerExtensions - { - public static IQuery QueryByIdAndVersion(this IWorkflowDefinitionManager manager, string workflowDefinitionId, VersionOptions versionOptions) => - manager.Query(x => x.WorkflowDefinitionId == workflowDefinitionId).WithVersion(versionOptions); - - public static IQuery QueryByVersionId(this IWorkflowDefinitionManager manager, string workflowDefinitionVersionId) => - manager.Query(x => x.WorkflowDefinitionVersionId == workflowDefinitionVersionId); - - public static async Task GetAsync( - this IWorkflowDefinitionManager manager, - string workflowDefinitionId, - VersionOptions versionOptions, - CancellationToken cancellationToken = default) => - await manager.QueryByIdAndVersion(workflowDefinitionId, versionOptions).FirstOrDefaultAsync(); - - public static async Task GetByVersionIdAsync( - this IWorkflowDefinitionManager manager, - string workflowDefinitionVersionId, - CancellationToken cancellationToken = default) => - await manager.QueryByVersionId(workflowDefinitionVersionId).FirstOrDefaultAsync(); - - public static Task> ListByStatusAsync( - this IWorkflowInstanceManager manager, - WorkflowStatus workflowStatus, - CancellationToken cancellationToken = default) => - manager - .Query(x => x.WorkflowStatus == workflowStatus) - .ListAsync(); - - public static Task> ListByBlockingActivityTypeAsync( - this IWorkflowInstanceManager manager, - string activityType, - CancellationToken cancellationToken = default) => - manager - .Query(x => x.ActivityType == activityType) - .ListAsync(); - } -} \ No newline at end of file diff --git a/src/core/Elsa.Core/Extensions/WorkflowInstanceManagerExtensions.cs b/src/core/Elsa.Core/Extensions/WorkflowInstanceManagerExtensions.cs deleted file mode 100644 index 6366107e9..000000000 --- a/src/core/Elsa.Core/Extensions/WorkflowInstanceManagerExtensions.cs +++ /dev/null @@ -1,73 +0,0 @@ -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Elsa.Indexes; -using Elsa.Models; -using Elsa.Services; - -namespace Elsa.Extensions -{ - public static class WorkflowInstanceManagerExtensions - { - public static async Task GetByIdAsync( - this IWorkflowInstanceManager manager, - string workflowInstanceId, - CancellationToken cancellationToken = default) => - await manager.Query(x => x.WorkflowInstanceId == workflowInstanceId).FirstOrDefaultAsync(); - - public static async Task GetByCorrelationIdAsync( - this IWorkflowInstanceManager manager, - string correlationId, - WorkflowStatus status, - CancellationToken cancellationToken = default) => - await manager.Query(x => x.CorrelationId == correlationId && x.WorkflowStatus == status).FirstOrDefaultAsync(); - - public static async Task CountAsync(this IWorkflowInstanceManager manager, CancellationToken cancellationToken = default) => await manager.Query().CountAsync(); - - public static async Task> ListAsync( - this IWorkflowInstanceManager manager, - int page, - int pageSize, - CancellationToken cancellationToken = default) => - await manager.Query().Skip(page * pageSize).Take(pageSize).ListAsync(); - - public static async Task> ListByCorrelationIdAsync( - this IWorkflowInstanceManager manager, - string correlationId, - WorkflowStatus status, - CancellationToken cancellationToken = default) => - await manager.Query(x => x.CorrelationId == correlationId && x.WorkflowStatus == status).ListAsync(); - - public static Task> ListByDefinitionAndStatusAsync( - this IWorkflowInstanceManager manager, - string workflowDefinitionId, - string? tenantId, - WorkflowStatus workflowStatus, - CancellationToken cancellationToken = default) - { - return manager.Query(x => x.WorkflowDefinitionId == workflowDefinitionId && x.TenantId == tenantId && x.WorkflowStatus == workflowStatus).ListAsync(); - } - - public static Task> ListByDefinitionAndStatusAsync( - this IWorkflowInstanceManager manager, - string workflowDefinitionId, - WorkflowStatus workflowStatus, - CancellationToken cancellationToken = default) => - manager.ListByDefinitionAndStatusAsync(workflowDefinitionId, default, workflowStatus, cancellationToken); - - public static Task> ListByDefinitionAsync( - this IWorkflowInstanceManager manager, - string workflowDefinitionId, - string? tenantId, - CancellationToken cancellationToken = default) - { - return manager.Query(x => x.WorkflowDefinitionId == workflowDefinitionId && x.TenantId == tenantId).ListAsync(); - } - - public static Task> ListByDefinitionAsync( - this IWorkflowInstanceManager manager, - string workflowDefinitionId, - CancellationToken cancellationToken = default) => - manager.ListByDefinitionAsync(workflowDefinitionId, default, cancellationToken); - } -} \ No newline at end of file diff --git a/src/core/Elsa.Core/Handlers/PersistWorkflow.cs b/src/core/Elsa.Core/Handlers/PersistWorkflow.cs index 1a002b87e..f2c99f6c0 100644 --- a/src/core/Elsa.Core/Handlers/PersistWorkflow.cs +++ b/src/core/Elsa.Core/Handlers/PersistWorkflow.cs @@ -2,7 +2,7 @@ using System.Threading; using System.Threading.Tasks; using Elsa.Events; using Elsa.Models; -using Elsa.Services; +using Elsa.Repositories; using Elsa.Services.Models; using MediatR; using Microsoft.Extensions.Logging; @@ -15,12 +15,12 @@ namespace Elsa.Handlers INotificationHandler, INotificationHandler { - private readonly IWorkflowInstanceManager _workflowInstanceManager; + private readonly IWorkflowInstanceRepository _workflowInstanceManager; private readonly ILogger _logger; - public PersistWorkflow(IWorkflowInstanceManager workflowInstanceManager, ILogger logger) + public PersistWorkflow(IWorkflowInstanceRepository workflowInstanceRepository, ILogger logger) { - _workflowInstanceManager = workflowInstanceManager; + _workflowInstanceManager = workflowInstanceRepository; _logger = logger; } diff --git a/src/core/Elsa.Core/Services/WorkflowInstanceManager.cs b/src/core/Elsa.Core/Services/WorkflowInstanceManager.cs deleted file mode 100644 index 8e49e3014..000000000 --- a/src/core/Elsa.Core/Services/WorkflowInstanceManager.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using System.Linq.Expressions; -using System.Threading; -using System.Threading.Tasks; -using Elsa.Data; -using Elsa.Events; -using Elsa.Models; -using MediatR; -using YesSql; -using YesSql.Indexes; - -namespace Elsa.Services -{ - public class WorkflowInstanceManager : IWorkflowInstanceManager - { - private readonly ISession _session; - private readonly IMediator _mediator; - - public WorkflowInstanceManager(ISession session, IMediator mediator) - { - _session = session; - _mediator = mediator; - } - - public async ValueTask SaveAsync(WorkflowInstance workflowInstance, CancellationToken cancellationToken = default) - { - _session.Save(workflowInstance, CollectionNames.WorkflowInstances); - await _session.CommitAsync(); - await _mediator.Publish(new WorkflowInstanceSaved(workflowInstance), cancellationToken); - } - - public async ValueTask DeleteAsync(WorkflowInstance workflowInstance, CancellationToken cancellationToken = default) - { - _session.Delete(workflowInstance, CollectionNames.WorkflowInstances); - await _session.CommitAsync(); - await _mediator.Publish(new WorkflowInstanceDeleted(workflowInstance), cancellationToken); - } - - public IQuery Query() => _session.Query(CollectionNames.WorkflowInstances); - public IQuery Query() where TIndex : class, IIndex => _session.Query(CollectionNames.WorkflowInstances); - public IQuery Query(Expression> predicate) where TIndex : class, IIndex => _session.Query(predicate, CollectionNames.WorkflowInstances); - public IQuery ExecuteQuery(ICompiledQuery query) => _session.ExecuteQuery(query, CollectionNames.WorkflowInstances); - } -} \ No newline at end of file diff --git a/src/core/Elsa.Core/Services/WorkflowPublisher.cs b/src/core/Elsa.Core/Services/WorkflowPublisher.cs index aaa58e994..270d1cde5 100644 --- a/src/core/Elsa.Core/Services/WorkflowPublisher.cs +++ b/src/core/Elsa.Core/Services/WorkflowPublisher.cs @@ -2,18 +2,19 @@ using System.Threading; using System.Threading.Tasks; using Elsa.Extensions; using Elsa.Models; +using Elsa.Repositories; namespace Elsa.Services { public class WorkflowPublisher : IWorkflowPublisher { - private readonly IWorkflowDefinitionManager _workflowDefinitionManager; + private readonly IWorkflowDefinitionRepository _workflowDefinitionRepository; private readonly IIdGenerator _idGenerator; private readonly ICloner _cloner; - public WorkflowPublisher(IWorkflowDefinitionManager workflowDefinitionManager, IIdGenerator idGenerator, ICloner cloner) + public WorkflowPublisher(IWorkflowDefinitionRepository workflowDefinitionRepository, IIdGenerator idGenerator, ICloner cloner) { - _workflowDefinitionManager = workflowDefinitionManager; + _workflowDefinitionRepository = workflowDefinitionRepository; _idGenerator = idGenerator; _cloner = cloner; } @@ -39,7 +40,7 @@ namespace Elsa.Services string workflowDefinitionId, CancellationToken cancellationToken) { - var definition = await _workflowDefinitionManager.GetAsync( + var definition = await _workflowDefinitionRepository.GetAsync( workflowDefinitionId, VersionOptions.Latest, cancellationToken); @@ -52,7 +53,7 @@ namespace Elsa.Services public async Task PublishAsync(WorkflowDefinition workflowDefinition, CancellationToken cancellationToken) { - var publishedDefinition = await _workflowDefinitionManager.GetAsync( + var publishedDefinition = await _workflowDefinitionRepository.GetAsync( workflowDefinition.WorkflowDefinitionId, VersionOptions.Published, cancellationToken); @@ -61,7 +62,7 @@ namespace Elsa.Services { publishedDefinition.IsPublished = false; publishedDefinition.IsLatest = false; - await _workflowDefinitionManager.SaveAsync(publishedDefinition, cancellationToken); + await _workflowDefinitionRepository.SaveAsync(publishedDefinition, cancellationToken); } if (workflowDefinition.IsPublished) @@ -76,14 +77,14 @@ namespace Elsa.Services workflowDefinition.IsLatest = true; workflowDefinition = Initialize(workflowDefinition); - await _workflowDefinitionManager.SaveAsync(workflowDefinition, cancellationToken); + await _workflowDefinitionRepository.SaveAsync(workflowDefinition, cancellationToken); return workflowDefinition; } public async Task GetDraftAsync(string workflowDefinitionId, CancellationToken cancellationToken) { - var definition = await _workflowDefinitionManager.GetAsync( + var definition = await _workflowDefinitionRepository.GetAsync( workflowDefinitionId, VersionOptions.Latest, cancellationToken); @@ -108,7 +109,7 @@ namespace Elsa.Services { var draft = workflowDefinition; - var latestVersion = await _workflowDefinitionManager.GetAsync( + var latestVersion = await _workflowDefinitionRepository.GetAsync( workflowDefinition.WorkflowDefinitionId, VersionOptions.Latest, cancellationToken); @@ -117,14 +118,14 @@ namespace Elsa.Services { latestVersion.IsLatest = false; - await _workflowDefinitionManager.SaveAsync(latestVersion, cancellationToken); + await _workflowDefinitionRepository.SaveAsync(latestVersion, cancellationToken); } draft.IsLatest = true; draft.IsPublished = false; draft = Initialize(draft); - await _workflowDefinitionManager.SaveAsync(draft, cancellationToken); + await _workflowDefinitionRepository.SaveAsync(draft, cancellationToken); return draft; } diff --git a/src/core/Elsa.Core/Services/WorkflowRunner.cs b/src/core/Elsa.Core/Services/WorkflowRunner.cs index 29a48f27c..6892ffa6b 100644 --- a/src/core/Elsa.Core/Services/WorkflowRunner.cs +++ b/src/core/Elsa.Core/Services/WorkflowRunner.cs @@ -7,8 +7,8 @@ using Elsa.ActivityResults; using Elsa.Builders; using Elsa.Events; using Elsa.Exceptions; -using Elsa.Extensions; using Elsa.Models; +using Elsa.Repositories; using Elsa.Services.Models; using Elsa.Triggers; using MediatR; @@ -28,7 +28,7 @@ namespace Elsa.Services private readonly IWorkflowRegistry _workflowRegistry; private readonly IWorkflowFactory _workflowFactory; private readonly IWorkflowSelector _workflowSelector; - private readonly IWorkflowInstanceManager _workflowInstanceManager; + private readonly IWorkflowInstanceRepository _workflowInstanceManager; private readonly Func _workflowBuilderFactory; private readonly IWorkflowContextManager _workflowContextManager; private readonly IMediator _mediator; @@ -43,7 +43,7 @@ namespace Elsa.Services IWorkflowContextManager workflowContextManager, IMediator mediator, IServiceProvider serviceProvider, - ILogger logger, IWorkflowInstanceManager workflowInstanceManager) + ILogger logger, IWorkflowInstanceRepository workflowInstanceRepository) { _workflowRegistry = workflowRegistry; _workflowFactory = workflowFactory; @@ -52,7 +52,7 @@ namespace Elsa.Services _mediator = mediator; _serviceProvider = serviceProvider; _logger = logger; - _workflowInstanceManager = workflowInstanceManager; + _workflowInstanceManager = workflowInstanceRepository; _workflowSelector = workflowSelector; } diff --git a/src/core/Elsa.Core/Services/WorkflowScheduler.cs b/src/core/Elsa.Core/Services/WorkflowScheduler.cs index 5bcc8f6d6..b6fe5e204 100644 --- a/src/core/Elsa.Core/Services/WorkflowScheduler.cs +++ b/src/core/Elsa.Core/Services/WorkflowScheduler.cs @@ -20,7 +20,7 @@ // public class WorkflowScheduler : IWorkflowScheduler, INotificationHandler // { // private readonly ICommandSender _commandSender; -// private readonly IWorkflowInstanceManager _workflowInstanceManager; +// private readonly IWorkflowInstanceRepository _workflowInstanceManager; // private readonly IWorkflowFactory _workflowFactory; // private readonly IWorkflowSelector _workflowSelector; // private readonly IWorkflowRegistry _workflowRegistry; @@ -28,14 +28,14 @@ // // public WorkflowScheduler( // ICommandSender commandSender, -// IWorkflowInstanceManager workflowInstanceManager, +// IWorkflowInstanceRepository workflowInstanceRepository, // IWorkflowFactory workflowFactory, // IWorkflowSelector workflowSelector, // IWorkflowRegistry workflowRegistry, // IWorkflowSchedulerQueue queue) // { // _commandSender = commandSender; -// _workflowInstanceManager = workflowInstanceManager; +// _workflowInstanceManager = workflowInstanceRepository; // _workflowFactory = workflowFactory; // _workflowSelector = workflowSelector; // _workflowRegistry = workflowRegistry; diff --git a/src/core/Elsa.Core/Services/WorkflowTriggerInterruptor.cs b/src/core/Elsa.Core/Services/WorkflowTriggerInterruptor.cs index a51bcb004..f5e8b8dad 100644 --- a/src/core/Elsa.Core/Services/WorkflowTriggerInterruptor.cs +++ b/src/core/Elsa.Core/Services/WorkflowTriggerInterruptor.cs @@ -1,11 +1,12 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using System.Runtime.CompilerServices; using System.Threading; using System.Threading.Tasks; using Elsa.Exceptions; -using Elsa.Extensions; + using Elsa.Models; +using Elsa.Repositories; using Elsa.Services.Models; namespace Elsa.Services @@ -14,13 +15,13 @@ namespace Elsa.Services { private readonly IWorkflowRunner _workflowRunner; private readonly IWorkflowRegistry _workflowRegistry; - private readonly IWorkflowInstanceManager _workflowInstanceManager; + private readonly IWorkflowInstanceRepository _workflowInstanceManager; - public WorkflowTriggerInterruptor(IWorkflowRunner workflowRunner, IWorkflowRegistry workflowRegistry, IWorkflowInstanceManager workflowInstanceManager) + public WorkflowTriggerInterruptor(IWorkflowRunner workflowRunner, IWorkflowRegistry workflowRegistry, IWorkflowInstanceRepository workflowInstanceRepository) { _workflowRunner = workflowRunner; _workflowRegistry = workflowRegistry; - _workflowInstanceManager = workflowInstanceManager; + _workflowInstanceManager = workflowInstanceRepository; } public async Task InterruptActivityAsync(WorkflowInstance workflowInstance, string activityId, object? input, CancellationToken cancellationToken) diff --git a/src/core/Elsa.Core/StartupTasks/ResumeRunningWorkflowsTask.cs b/src/core/Elsa.Core/StartupTasks/ResumeRunningWorkflowsTask.cs index 234df744f..b290ffbb4 100644 --- a/src/core/Elsa.Core/StartupTasks/ResumeRunningWorkflowsTask.cs +++ b/src/core/Elsa.Core/StartupTasks/ResumeRunningWorkflowsTask.cs @@ -3,6 +3,7 @@ using System.Threading.Tasks; using Elsa.DistributedLock; using Elsa.Extensions; using Elsa.Models; +using Elsa.Repositories; using Elsa.Services; namespace Elsa.StartupTasks @@ -13,16 +14,16 @@ namespace Elsa.StartupTasks /// public class ResumeRunningWorkflowsTask : IStartupTask { - private readonly IWorkflowInstanceManager _workflowInstanceManager; + private readonly IWorkflowInstanceRepository _workflowInstanceManager; private readonly IWorkflowRunner _workflowScheduler; private readonly IDistributedLockProvider _distributedLockProvider; public ResumeRunningWorkflowsTask( - IWorkflowInstanceManager workflowInstanceManager, + IWorkflowInstanceRepository workflowInstanceRepository, IWorkflowRunner workflowScheduler, IDistributedLockProvider distributedLockProvider) { - _workflowInstanceManager = workflowInstanceManager; + _workflowInstanceManager = workflowInstanceRepository; _workflowScheduler = workflowScheduler; _distributedLockProvider = distributedLockProvider; } diff --git a/src/core/Elsa.Core/Triggers/WorkflowSelector.cs b/src/core/Elsa.Core/Triggers/WorkflowSelector.cs index 8799bef7d..438bef872 100644 --- a/src/core/Elsa.Core/Triggers/WorkflowSelector.cs +++ b/src/core/Elsa.Core/Triggers/WorkflowSelector.cs @@ -1,10 +1,10 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; -using Elsa.Extensions; using Elsa.Models; +using Elsa.Repositories; using Elsa.Services; using Elsa.Services.Models; using Microsoft.Extensions.Caching.Memory; @@ -18,7 +18,7 @@ namespace Elsa.Triggers private const string CacheKey = "WorkflowSelector:Triggers"; private readonly IWorkflowRegistry _workflowRegistry; private readonly IWorkflowFactory _workflowFactory; - private readonly IWorkflowInstanceManager _workflowInstanceManager; + private readonly IWorkflowInstanceRepository _workflowInstanceManager; private readonly IWorkflowContextManager _workflowContextManager; private readonly IEnumerable _triggerProviders; private readonly IMemoryCache _memoryCache; @@ -28,7 +28,7 @@ namespace Elsa.Triggers public WorkflowSelector( IWorkflowRegistry workflowRegistry, IWorkflowFactory workflowFactory, - IWorkflowInstanceManager workflowInstanceManager, + IWorkflowInstanceRepository workflowInstanceRepository, IWorkflowContextManager workflowContextManager, IEnumerable triggerProviders, IMemoryCache memoryCache, @@ -36,7 +36,7 @@ namespace Elsa.Triggers { _workflowRegistry = workflowRegistry; _workflowFactory = workflowFactory; - _workflowInstanceManager = workflowInstanceManager; + _workflowInstanceManager = workflowInstanceRepository; _workflowContextManager = workflowContextManager; _triggerProviders = triggerProviders; _memoryCache = memoryCache; diff --git a/src/core/Elsa.Core/WorkflowProviders/DatabaseWorkflowProvider.cs b/src/core/Elsa.Core/WorkflowProviders/DatabaseWorkflowProvider.cs index c7e8e66c4..1ff146074 100644 --- a/src/core/Elsa.Core/WorkflowProviders/DatabaseWorkflowProvider.cs +++ b/src/core/Elsa.Core/WorkflowProviders/DatabaseWorkflowProvider.cs @@ -1,7 +1,9 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; + +using Elsa.Repositories; using Elsa.Services; using Elsa.Services.Models; @@ -12,18 +14,18 @@ namespace Elsa.WorkflowProviders /// public class DatabaseWorkflowProvider : WorkflowProvider { - private readonly IWorkflowDefinitionManager _workflowDefinitionManager; + private readonly IWorkflowDefinitionRepository _workflowDefinitionRepository; private readonly IWorkflowBlueprintMaterializer _workflowBlueprintMaterializer; - public DatabaseWorkflowProvider(IWorkflowDefinitionManager workflowDefinitionManager, IWorkflowBlueprintMaterializer workflowBlueprintMaterializer) + public DatabaseWorkflowProvider(IWorkflowDefinitionRepository workflowDefinitionRepository, IWorkflowBlueprintMaterializer workflowBlueprintMaterializer) { - _workflowDefinitionManager = workflowDefinitionManager; + _workflowDefinitionRepository = workflowDefinitionRepository; _workflowBlueprintMaterializer = workflowBlueprintMaterializer; } protected override async ValueTask> OnGetWorkflowsAsync(CancellationToken cancellationToken) { - var workflowDefinitions = await _workflowDefinitionManager.ListAsync(cancellationToken: cancellationToken); + var workflowDefinitions = await _workflowDefinitionRepository.ListAsync(cancellationToken: cancellationToken); return workflowDefinitions.Select(_workflowBlueprintMaterializer.CreateWorkflowBlueprint); } } diff --git a/src/persistence/Elsa.Persistence.InMemory/Elsa.Persistence.InMemory.csproj b/src/persistence/Elsa.Persistence.InMemory/Elsa.Persistence.InMemory.csproj new file mode 100644 index 000000000..125e6f34a --- /dev/null +++ b/src/persistence/Elsa.Persistence.InMemory/Elsa.Persistence.InMemory.csproj @@ -0,0 +1,33 @@ + + + + netstandard2.0 + latest + Elsa.Persistence.InMemory + 1.0.0 + Elsa Contributors + + Elsa is a set of workflow libraries and tools that enable super-fast workflowing capabilities in any .NET Core application. + This package provides a InMemory persistence provider. + + 2020 + https://github.com/elsa-workflows/elsa-core + https://github.com/elsa-workflows/elsa-core + GitHub + elsa, workflows, orchard + icon.png + enable + + + + + True + + + + + + + + + diff --git a/src/persistence/Elsa.Persistence.InMemory/IServiceCollectionExtensions.cs b/src/persistence/Elsa.Persistence.InMemory/IServiceCollectionExtensions.cs new file mode 100644 index 000000000..9e0387e42 --- /dev/null +++ b/src/persistence/Elsa.Persistence.InMemory/IServiceCollectionExtensions.cs @@ -0,0 +1,20 @@ +using Elsa.Repositories; +using Elsa.WorkflowProviders; + +using Microsoft.Extensions.DependencyInjection; + +namespace Elsa.Persistence.InMemory +{ + public static class IServiceCollectionExtensions + { + public static IServiceCollection AddElsaPersistenceInMemory(this IServiceCollection services) + { + // Scoped, because IMediator is registered as Scoped and IIdGenerator could also be registered as Scoped + services.AddScoped() + .AddScoped() + .AddWorkflowProvider(); + + return services; + } + } +} diff --git a/src/persistence/Elsa.Persistence.InMemory/InMemoryWorkflowDefinitionRepository.cs b/src/persistence/Elsa.Persistence.InMemory/InMemoryWorkflowDefinitionRepository.cs new file mode 100644 index 000000000..5e4f5f4cb --- /dev/null +++ b/src/persistence/Elsa.Persistence.InMemory/InMemoryWorkflowDefinitionRepository.cs @@ -0,0 +1,82 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +using Elsa.Models; +using Elsa.Repositories; +using Elsa.Services; + +namespace Elsa.Persistence.InMemory +{ + public class InMemoryWorkflowDefinitionRepository : IWorkflowDefinitionRepository + { + private static readonly List _definitions = new List(); + private readonly IIdGenerator _idGenerator; + + public InMemoryWorkflowDefinitionRepository(IIdGenerator idGenerator) + { + _idGenerator = idGenerator; + } + + public Task CountAsync(VersionOptions? version = null, CancellationToken cancellationToken = default) + { + return Task.FromResult(_definitions.WithVersion(version).Count()); + } + + public Task DeleteAsync(WorkflowDefinition workflowDefinition, CancellationToken cancellationToken = default) + { + _definitions.Remove(workflowDefinition); + return Task.CompletedTask; + } + + public Task GetAsync(string workflowDefinitionId, VersionOptions version, CancellationToken cancellationToken = default) + { + return Task.FromResult(_definitions.WithVersion(version).Where(x => x.WorkflowDefinitionId == workflowDefinitionId).FirstOrDefault()); + } + + public Task GetByVersionIdAsync(string workflowDefinitionVersionId, CancellationToken cancellationToken = default) + { + return Task.FromResult(_definitions.Where(x => x.WorkflowDefinitionVersionId == workflowDefinitionVersionId).FirstOrDefault()); + } + + public WorkflowDefinition Initialize(WorkflowDefinition workflowDefinition) + { + if (string.IsNullOrWhiteSpace(workflowDefinition.WorkflowDefinitionId)) + workflowDefinition.WorkflowDefinitionId = _idGenerator.Generate(); + + if (workflowDefinition.Version == 0) + workflowDefinition.Version = 1; + + if (string.IsNullOrWhiteSpace(workflowDefinition.WorkflowDefinitionVersionId)) + workflowDefinition.WorkflowDefinitionVersionId = _idGenerator.Generate(); + + return workflowDefinition; + } + + public Task> ListAsync(int? skip = null, int? take = null, VersionOptions? version = null, CancellationToken cancellationToken = default) + { + var query = _definitions.WithVersion(); + + if(skip.HasValue) + { + query = query.Skip(skip.Value); + } + + if(take.HasValue) + { + query = query.Take(take.Value); + } + + return Task.FromResult(query); + } + + public Task SaveAsync(WorkflowDefinition workflowDefinition, CancellationToken cancellationToken = default) + { + workflowDefinition = Initialize(workflowDefinition); + _definitions.Add(workflowDefinition); + return Task.CompletedTask; + } + + } +} diff --git a/src/persistence/Elsa.Persistence.InMemory/InMemoryWorkflowInstanceRepository.cs b/src/persistence/Elsa.Persistence.InMemory/InMemoryWorkflowInstanceRepository.cs new file mode 100644 index 000000000..fda181abf --- /dev/null +++ b/src/persistence/Elsa.Persistence.InMemory/InMemoryWorkflowInstanceRepository.cs @@ -0,0 +1,111 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +using Elsa.Events; +using Elsa.Models; +using Elsa.Repositories; + +using MediatR; + +#nullable disable + +namespace Elsa.Persistence.InMemory +{ + public class InMemoryWorkflowInstanceRepository : IWorkflowInstanceRepository + { + private static readonly List _instances = new List(); + private readonly IMediator _mediator; + + public InMemoryWorkflowInstanceRepository(IMediator mediator) + { + _mediator = mediator; + } + + public Task CountAsync(CancellationToken cancellationToken = default) + { + return Task.FromResult(_instances.Count()); + } + + public async Task DeleteAsync(WorkflowInstance workflowInstance, CancellationToken cancellationToken = default) + { + _instances.Remove(workflowInstance); + await _mediator.Publish(new WorkflowInstanceDeleted(workflowInstance), cancellationToken); + } + + public Task GetByCorrelationIdAsync(string correlationId, WorkflowStatus status, CancellationToken cancellationToken = default) + { + return Task.FromResult(_instances.FirstOrDefault(instance => instance.CorrelationId == correlationId && instance.Status == status)); + } + + public Task GetByIdAsync(string workflowInstanceId, CancellationToken cancellationToken = default) + { + return Task.FromResult(_instances + .FirstOrDefault(instance => instance.WorkflowInstanceId == workflowInstanceId)); + } + + public Task IsWorkflowIsAlreadyExecutingAsync(string tenantId, string workflowDefinitionId, CancellationToken cancellationToken = default) + { + return Task.FromResult(_instances + .Any(instance => instance.WorkflowDefinitionId == workflowDefinitionId + && (instance.Status == WorkflowStatus.Running || instance.Status == WorkflowStatus.Suspended) + && instance.TenantId == tenantId)); + } + + public Task> ListAsync(int page, int pageSize, CancellationToken cancellationToken = default) + { + return Task.FromResult(_instances.Skip(page * pageSize).Take(pageSize)); + } + + public Task> ListByBlockingActivityTypeAsync(string activityType, CancellationToken cancellationToken = default) + { + return Task.FromResult(_instances + .Where(instance => instance.BlockingActivities.Any(a => a.ActivityType == activityType))); + } + + public Task> ListByCorrelationIdAsync(string correlationId, WorkflowStatus status, CancellationToken cancellationToken = default) + { + return Task.FromResult(_instances.Where(instance => instance.CorrelationId == correlationId && instance.Status == status)); + } + + public Task> ListByDefinitionAndStatusAsync(string workflowDefinitionId, string tenantId, WorkflowStatus workflowStatus, CancellationToken cancellationToken = default) + { + return Task.FromResult(_instances + .Where(instance => instance.WorkflowDefinitionId == workflowDefinitionId && instance.Status == workflowStatus + && instance.TenantId == tenantId)); + } + + public Task> ListByDefinitionAsync(string workflowDefinitionId, string tenantId, CancellationToken cancellationToken = default) + { + return Task.FromResult(_instances.Where(x => x.WorkflowDefinitionId == workflowDefinitionId && x.TenantId == tenantId)); + } + + public Task> ListByStatusAsync(WorkflowStatus workflowStatus, CancellationToken cancellationToken = default) + { + return Task.FromResult(_instances.Where(instance => instance.Status == workflowStatus)); + } + + public async Task SaveAsync(WorkflowInstance workflowInstance, CancellationToken cancellationToken = default) + { + if (workflowInstance.Id == 0) + { + workflowInstance.Id = workflowInstance.WorkflowInstanceId.GetHashCode(); + _instances.Add(workflowInstance); + } + else + { + for (var i = 0; i < _instances.Count; i++) + { + if (workflowInstance.WorkflowInstanceId == _instances[i].WorkflowInstanceId) + { + _instances[i] = workflowInstance; + } + } + } + + await _mediator.Publish(new WorkflowInstanceSaved(workflowInstance), cancellationToken); + } + } +} diff --git a/src/persistence/Elsa.Persistence.InMemory/icon.png b/src/persistence/Elsa.Persistence.InMemory/icon.png new file mode 100644 index 000000000..28dbaafbf Binary files /dev/null and b/src/persistence/Elsa.Persistence.InMemory/icon.png differ diff --git a/src/persistence/Elsa.Persistence.MongoDb/Elsa.Persistence.MongoDb.csproj b/src/persistence/Elsa.Persistence.MongoDb/Elsa.Persistence.MongoDb.csproj new file mode 100644 index 000000000..7c3837d60 --- /dev/null +++ b/src/persistence/Elsa.Persistence.MongoDb/Elsa.Persistence.MongoDb.csproj @@ -0,0 +1,37 @@ + + + + netstandard2.0 + latest + Elsa.Persistence.MongoDb + 1.0.0 + Elsa Contributors + + Elsa is a set of workflow libraries and tools that enable super-fast workflowing capabilities in any .NET Core application. + This package provides a MongoDb persistence provider. + + 2020 + https://github.com/elsa-workflows/elsa-core + https://github.com/elsa-workflows/elsa-core + GitHub + elsa, workflows, orchard + icon.png + enable + + + + + True + + + + + + + + + + + + + diff --git a/src/persistence/Elsa.Persistence.MongoDb/ElsaMongoDbClient.cs b/src/persistence/Elsa.Persistence.MongoDb/ElsaMongoDbClient.cs new file mode 100644 index 000000000..9691d5ca8 --- /dev/null +++ b/src/persistence/Elsa.Persistence.MongoDb/ElsaMongoDbClient.cs @@ -0,0 +1,24 @@ +using Elsa.Data; +using Elsa.Models; + +using Microsoft.Extensions.Options; + +using MongoDB.Driver; + +namespace Elsa.Persistence.MongoDb +{ + public class ElsaMongoDbClient + { + private readonly MongoClient _mongoClient; + private readonly IMongoDatabase _mongoDatabase; + + public ElsaMongoDbClient(IOptions options) + { + _mongoClient = new MongoClient(options.Value.ConnectionString); + _mongoDatabase = _mongoClient.GetDatabase(options.Value.Db); + } + + public IMongoCollection WorkflowDefinitions => _mongoDatabase.GetCollection(CollectionNames.WorkflowDefinitions); + public IMongoCollection WorkflowInstances => _mongoDatabase.GetCollection(CollectionNames.WorkflowInstances); + } +} diff --git a/src/persistence/Elsa.Persistence.MongoDb/ElsaMongoDbOptions.cs b/src/persistence/Elsa.Persistence.MongoDb/ElsaMongoDbOptions.cs new file mode 100644 index 000000000..ee7e8f3ed --- /dev/null +++ b/src/persistence/Elsa.Persistence.MongoDb/ElsaMongoDbOptions.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Elsa.Persistence.MongoDb +{ + public class ElsaMongoDbOptions + { + public string? ConnectionString { get; set; } + public string? Db { get; set; } + } +} diff --git a/src/persistence/Elsa.Persistence.MongoDb/IServiceCollectionExtensions.cs b/src/persistence/Elsa.Persistence.MongoDb/IServiceCollectionExtensions.cs new file mode 100644 index 000000000..29b08af27 --- /dev/null +++ b/src/persistence/Elsa.Persistence.MongoDb/IServiceCollectionExtensions.cs @@ -0,0 +1,49 @@ +using System; + +using Elsa.Persistence.MongoDb.Services; + +using Microsoft.Extensions.DependencyInjection; + +using Microsoft.Extensions.Configuration; + +using Elsa.Repositories; +using Elsa.Runtime; +using Elsa.WorkflowProviders; +using Elsa.Models; +using MongoDB.Driver; + +namespace Elsa.Persistence.MongoDb +{ + public static class IServiceCollectionExtensions + { + + public static IServiceCollection AddElsaPersistenceMongoDb(this IServiceCollection services, Action configureOptions) + { + AddCore(services); + services.Configure(configureOptions); + + return services; + } + + public static IServiceCollection AddElsaPersistenceMongoDb(this IServiceCollection services, IConfiguration options) + { + AddCore(services); + services.Configure(options); + return services; + } + + private static void AddCore(IServiceCollection services) + { + services.AddScoped() + .AddScoped() + .AddScoped() + .AddScoped>(services => services.GetRequiredService().WorkflowDefinitions) + .AddScoped>(services => services.GetRequiredService().WorkflowInstances) + .AddWorkflowProvider() + .AddStartupTask(); + + DatabaseRegister.RegisterMapsAndSerializers(); + + } + } +} diff --git a/src/persistence/Elsa.Persistence.MongoDb/MongoDbWorkflowDefinitionRepository.cs b/src/persistence/Elsa.Persistence.MongoDb/MongoDbWorkflowDefinitionRepository.cs new file mode 100644 index 000000000..5321ed25f --- /dev/null +++ b/src/persistence/Elsa.Persistence.MongoDb/MongoDbWorkflowDefinitionRepository.cs @@ -0,0 +1,104 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +using Elsa.Models; +using Elsa.Repositories; +using Elsa.Services; + +using MongoDB.Driver; +using MongoDB.Driver.Linq; + +namespace Elsa.Persistence.MongoDb +{ + public class MongoDbWorkflowDefinitionRepository : IWorkflowDefinitionRepository + { + private readonly IMongoCollection _workflowDefinitions; + private readonly IIdGenerator _idGenerator; + + + public MongoDbWorkflowDefinitionRepository(IMongoCollection workflowDefinitions, IIdGenerator idGenerator) + { + _workflowDefinitions = workflowDefinitions; + _idGenerator = idGenerator; + } + + public async Task CountAsync(VersionOptions? version = null, CancellationToken cancellationToken = default) + { + return await ((IMongoQueryable)_workflowDefinitions.AsQueryable().WithVersion(version)).CountAsync(); + } + + public async Task DeleteAsync(WorkflowDefinition workflowDefinition, CancellationToken cancellationToken = default) + { + var filter = GetFilterWorkflowDefinitionId(workflowDefinition.Id); + await _workflowDefinitions.DeleteOneAsync(filter); + } + + public async Task GetAsync(string workflowDefinitionId, VersionOptions versionOptions, CancellationToken cancellationToken = default) + { + return await((IMongoQueryable)_workflowDefinitions + .AsQueryable() + .Where(x => x.WorkflowDefinitionId == workflowDefinitionId) + .WithVersion(versionOptions)).FirstOrDefaultAsync(); + } + + public async Task GetByVersionIdAsync(string workflowDefinitionVersionId, CancellationToken cancellationToken = default) + { + return await((IMongoQueryable)_workflowDefinitions + .AsQueryable() + .Where(x => x.WorkflowDefinitionVersionId == workflowDefinitionVersionId)).FirstOrDefaultAsync(); + } + + public WorkflowDefinition Initialize(WorkflowDefinition workflowDefinition) + { + if (string.IsNullOrWhiteSpace(workflowDefinition.WorkflowDefinitionId)) + workflowDefinition.WorkflowDefinitionId = _idGenerator.Generate(); + + if (workflowDefinition.Version == 0) + workflowDefinition.Version = 1; + + if (string.IsNullOrWhiteSpace(workflowDefinition.WorkflowDefinitionVersionId)) + workflowDefinition.WorkflowDefinitionVersionId = _idGenerator.Generate(); + + return workflowDefinition; + } + + public async Task> ListAsync(int? skip = null, int? take = null, VersionOptions? version = null, CancellationToken cancellationToken = default) + { + var query = _workflowDefinitions + .AsQueryable() + .WithVersion(version); + + if (skip != null) + query = query.Skip(skip.Value); + + if (take != null) + query = query.Take(take.Value); + + return await ((IMongoQueryable)query).ToListAsync(); + } + + public async Task SaveAsync(WorkflowDefinition workflowDefinition, CancellationToken cancellationToken = default) + { + if (workflowDefinition.Id == 0) + { + // If there is no instance yet, max throws an error + if (await _workflowDefinitions.AsQueryable().AnyAsync()) + { + workflowDefinition.Id = await _workflowDefinitions.AsQueryable().MaxAsync(x => x.Id) + 1; + } + else + { + workflowDefinition.Id = 1; + } + } + + var filter = GetFilterWorkflowDefinitionId(workflowDefinition.Id); + + await _workflowDefinitions.ReplaceOneAsync(filter, workflowDefinition, new ReplaceOptions { IsUpsert = true }); + } + + private FilterDefinition GetFilterWorkflowDefinitionId(int id) => Builders.Filter.Where(x => x.Id == id); + } +} diff --git a/src/persistence/Elsa.Persistence.MongoDb/MongoDbWorkflowInstanceRepository.cs b/src/persistence/Elsa.Persistence.MongoDb/MongoDbWorkflowInstanceRepository.cs new file mode 100644 index 000000000..5fadc7ecf --- /dev/null +++ b/src/persistence/Elsa.Persistence.MongoDb/MongoDbWorkflowInstanceRepository.cs @@ -0,0 +1,131 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +using Elsa.Events; +using Elsa.Models; +using Elsa.Repositories; + +using MediatR; + +using MongoDB.Bson; +using MongoDB.Driver; +using MongoDB.Driver.Linq; + +namespace Elsa.Persistence.MongoDb +{ + public class MongoDbWorkflowInstanceRepository : IWorkflowInstanceRepository + { + private readonly IMongoCollection _workflowInstances; + private readonly IMediator _mediator; + + public MongoDbWorkflowInstanceRepository(IMediator mediator, IMongoCollection workflowInstances) + { + _mediator = mediator; + _workflowInstances = workflowInstances; + } + + public async Task CountAsync(CancellationToken cancellationToken = default) + { + var count = await _workflowInstances.CountDocumentsAsync(new BsonDocument()); + + return (int)count; + } + + public async Task DeleteAsync(WorkflowInstance workflowInstance, CancellationToken cancellationToken = default) + { + var filter = GetFilterWorkflowId(workflowInstance.Id); + await _workflowInstances.DeleteOneAsync(filter); + await _mediator.Publish(new WorkflowInstanceDeleted(workflowInstance), cancellationToken); + } + + public Task GetByCorrelationIdAsync(string correlationId, WorkflowStatus status, CancellationToken cancellationToken = default) + { + return _workflowInstances.AsQueryable() + .FirstOrDefaultAsync(instance => instance.CorrelationId == correlationId && instance.Status == status); + } + + public async Task GetByIdAsync(string workflowInstanceId, CancellationToken cancellationToken = default) + { + + return await _workflowInstances + .AsQueryable().FirstOrDefaultAsync(instance => instance.WorkflowInstanceId == workflowInstanceId); + } + + public Task IsWorkflowIsAlreadyExecutingAsync(string? tenantId, string workflowDefinitionId, CancellationToken cancellationToken = default) + { + return _workflowInstances + .AsQueryable().AnyAsync(instance => instance.WorkflowDefinitionId == workflowDefinitionId + && (instance.Status == WorkflowStatus.Running || instance.Status == WorkflowStatus.Suspended) + && instance.TenantId == tenantId); + } + + public async Task> ListAsync(int page, int pageSize, CancellationToken cancellationToken = default) + { + return await _workflowInstances + .AsQueryable().Skip(page * pageSize).Take(pageSize).ToListAsync(); + } + + public async Task> ListByBlockingActivityTypeAsync(string activityType, CancellationToken cancellationToken = default) + { + return await _workflowInstances + .AsQueryable().Where(instance => instance.BlockingActivities.Any(a => a.ActivityType == activityType)).ToListAsync(); + } + + public async Task> ListByCorrelationIdAsync(string correlationId, WorkflowStatus status, CancellationToken cancellationToken = default) + { + return await _workflowInstances + .AsQueryable() + .Where(instance => instance.CorrelationId == correlationId && instance.Status == status).ToListAsync(); + } + + public Task> ListByDefinitionAndStatusAsync(string workflowDefinitionId, WorkflowStatus workflowStatus, CancellationToken cancellationToken = default) + { + return ListByDefinitionAndStatusAsync(workflowDefinitionId, default, workflowStatus, cancellationToken); + } + + public async Task> ListByDefinitionAndStatusAsync(string workflowDefinitionId, string? tenantId, WorkflowStatus workflowStatus, CancellationToken cancellationToken = default) + { + return await _workflowInstances + .AsQueryable() + .Where(instance => instance.WorkflowDefinitionId == workflowDefinitionId && instance.Status == workflowStatus + && instance.TenantId == tenantId).ToListAsync(); + } + + public async Task> ListByDefinitionAsync(string workflowDefinitionId, string? tenantId, CancellationToken cancellationToken = default) + { + return await _workflowInstances + .AsQueryable().Where(x => x.WorkflowDefinitionId == workflowDefinitionId && x.TenantId == tenantId).ToListAsync(); + } + + public async Task> ListByStatusAsync(WorkflowStatus workflowStatus, CancellationToken cancellationToken = default) + { + return await _workflowInstances + .AsQueryable() + .Where(instance => instance.Status == workflowStatus).ToListAsync(); + } + + public async Task SaveAsync(WorkflowInstance workflowInstance, CancellationToken cancellationToken = default) + { + if(workflowInstance.Id == 0) + { + // If there is no instance yet, max throws an error + if (await _workflowInstances.AsQueryable().AnyAsync()) + { + workflowInstance.Id = await _workflowInstances.AsQueryable().MaxAsync(x => x.Id) + 1; + } else + { + workflowInstance.Id = 1; + } + } + + var filter = GetFilterWorkflowId(workflowInstance.Id); + + await _workflowInstances.ReplaceOneAsync(filter, workflowInstance, new ReplaceOptions { IsUpsert = true }); + await _mediator.Publish(new WorkflowInstanceSaved(workflowInstance), cancellationToken); + } + + private FilterDefinition GetFilterWorkflowId(int id) => Builders.Filter.Where(x => x.Id == id); + } +} diff --git a/src/persistence/Elsa.Persistence.MongoDb/Serializers/JsonSerializer.cs b/src/persistence/Elsa.Persistence.MongoDb/Serializers/JsonSerializer.cs new file mode 100644 index 000000000..7e28d25fa --- /dev/null +++ b/src/persistence/Elsa.Persistence.MongoDb/Serializers/JsonSerializer.cs @@ -0,0 +1,52 @@ +using System; + +using MongoDB.Bson.Serialization; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +using NodaTime; +using NodaTime.Serialization.JsonNet; + +namespace Elsa.Persistence.MongoDb.Serializers +{ + public class JsonSerializer : IBsonSerializer + { + public static JsonSerializer Instance { get; } = new JsonSerializer(); + + private readonly JsonSerializerSettings serializerSettings = new JsonSerializerSettings + { + NullValueHandling = NullValueHandling.Ignore + }.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb); + + public System.Type ValueType => typeof(JObject); + + public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, object value) + { + Serialize(context, args, (JObject)value); + } + + public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, JObject value) + { + if ((value is JObject jObject) == false) + { + throw new ArgumentNullException(nameof(value)); + } + + var json = JsonConvert.SerializeObject(value, serializerSettings); + context.Writer.WriteString(json); + } + + object IBsonSerializer.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) + { + return Deserialize(context, args); + } + + public JObject Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) + { + var jObjectStr = context.Reader.ReadString(); + + return JsonConvert.DeserializeObject(jObjectStr, serializerSettings); + } + } +} diff --git a/src/persistence/Elsa.Persistence.MongoDb/Serializers/NodaTimeSerializer.cs b/src/persistence/Elsa.Persistence.MongoDb/Serializers/NodaTimeSerializer.cs new file mode 100644 index 000000000..ff84c7e55 --- /dev/null +++ b/src/persistence/Elsa.Persistence.MongoDb/Serializers/NodaTimeSerializer.cs @@ -0,0 +1,59 @@ +using System; + +using MongoDB.Bson; +using MongoDB.Bson.Serialization; + +using NodaTime.Text; + +namespace Elsa.Persistence.MongoDb.Serializers +{ + public class NodaTimeSerializer : IBsonSerializer + { + public static NodaTimeSerializer Instance { get; } = new NodaTimeSerializer(); + + public Type ValueType => typeof(NodaTime.Instant); + + object IBsonSerializer.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) + { + return Deserialize(context, args); + } + + public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, NodaTime.Instant value) + { + if (value == null) + throw new ArgumentNullException(nameof(value)); + + context.Writer.WriteString(InstantPattern.CreateWithInvariantCulture("g").Format(value)); + } + + public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, object value) + { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + Serialize(context, args, (NodaTime.Instant)value); + } + + public NodaTime.Instant Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) + { + var bsonType = context.Reader.GetCurrentBsonType(); + + if (bsonType != BsonType.String) + { + throw new InvalidOperationException($"Cannot deserialize NodaTime.Instant from BsonType {bsonType}."); + } + + var nodaTimeString = context.Reader.ReadString(); + var parseResult = InstantPattern.CreateWithInvariantCulture("g").Parse(nodaTimeString); + + if (!parseResult.Success) + { + throw parseResult.Exception; + } + + return parseResult.Value; + } + } +} diff --git a/src/persistence/Elsa.Persistence.MongoDb/Services/DatabaseInitializer.cs b/src/persistence/Elsa.Persistence.MongoDb/Services/DatabaseInitializer.cs new file mode 100644 index 000000000..35b4b719a --- /dev/null +++ b/src/persistence/Elsa.Persistence.MongoDb/Services/DatabaseInitializer.cs @@ -0,0 +1,48 @@ +using System; +using System.Threading; +using System.Threading.Tasks; + +using Elsa.Models; +using Elsa.Persistence.MongoDb.Serializers; +using Elsa.Services; + +using MongoDB.Bson.Serialization; +using MongoDB.Driver; + +namespace Elsa.Persistence.MongoDb.Services +{ + public class DatabaseInitializer : IStartupTask + { + private readonly ElsaMongoDbClient _workflowEngineMongoDbClient; + + public DatabaseInitializer(ElsaMongoDbClient workflowEngineMongoDbClient) + { + _workflowEngineMongoDbClient = workflowEngineMongoDbClient; + } + + /// + /// Create Indexies + /// + /// + /// + public async Task ExecuteAsync(CancellationToken cancellationToken = default) + { + await CreateWorkflowInstancesIndexies(cancellationToken); + await CreateWorkflowDefinitionsIndexies(cancellationToken); + } + + + private async Task CreateWorkflowInstancesIndexies(CancellationToken cancellationToken) + { + var indexKeysDefinition = Builders.IndexKeys.Ascending(x => x.WorkflowInstanceId); + await _workflowEngineMongoDbClient.WorkflowInstances.Indexes.CreateOneAsync(new CreateIndexModel(indexKeysDefinition),cancellationToken: cancellationToken); + } + + private async Task CreateWorkflowDefinitionsIndexies(CancellationToken cancellationToken) + { + var indexKeysDefinition = Builders.IndexKeys.Ascending(x => x.WorkflowDefinitionId).Descending(x => x.Version); + await _workflowEngineMongoDbClient.WorkflowDefinitions.Indexes.CreateOneAsync(new CreateIndexModel(indexKeysDefinition), cancellationToken: cancellationToken); + } + + } +} diff --git a/src/persistence/Elsa.Persistence.MongoDb/Services/DatabaseRegister.cs b/src/persistence/Elsa.Persistence.MongoDb/Services/DatabaseRegister.cs new file mode 100644 index 000000000..aca5ecb97 --- /dev/null +++ b/src/persistence/Elsa.Persistence.MongoDb/Services/DatabaseRegister.cs @@ -0,0 +1,64 @@ +using System; +using System.Threading; +using System.Threading.Tasks; + +using Elsa.Models; +using Elsa.Persistence.MongoDb.Serializers; +using Elsa.Services; + +using MongoDB.Bson.Serialization; + +namespace Elsa.Persistence.MongoDb.Services +{ + public static class DatabaseRegister + { + public static void RegisterMapsAndSerializers() + { + // In unit tests, the method is called several times, which throws an exception because the entity is already registered + // If an error is thrown, the remaining registrations are no longer processed + var firstPass = Map(); + if(firstPass == false) + { + return; + } + + RegisterSerializers(); + } + + private static bool Map() + { + if (BsonClassMap.IsClassMapRegistered(typeof(WorkflowDefinition))) + { + return false; + } + + try + { + + BsonClassMap.RegisterClassMap(cm => + { + cm.AutoMap(); + cm.MapIdMember(x => x.Id); + }); + + BsonClassMap.RegisterClassMap(cm => + { + cm.AutoMap(); + cm.MapIdMember(x => x.Id); + }); + + } + catch (Exception) { + return false; + } + + return true; + } + + private static void RegisterSerializers() + { + BsonSerializer.RegisterSerializer(JsonSerializer.Instance); + BsonSerializer.RegisterSerializer(NodaTimeSerializer.Instance); + } + } +} diff --git a/src/persistence/Elsa.Persistence.MongoDb/icon.png b/src/persistence/Elsa.Persistence.MongoDb/icon.png new file mode 100644 index 000000000..28dbaafbf Binary files /dev/null and b/src/persistence/Elsa.Persistence.MongoDb/icon.png differ diff --git a/src/core/Elsa.Core/Data/Services/CustomJsonContentSerializer.cs b/src/persistence/Elsa.Persistence.YesSql/CustomJsonContentSerializer.cs similarity index 95% rename from src/core/Elsa.Core/Data/Services/CustomJsonContentSerializer.cs rename to src/persistence/Elsa.Persistence.YesSql/CustomJsonContentSerializer.cs index 555cb51eb..78ac03685 100644 --- a/src/core/Elsa.Core/Data/Services/CustomJsonContentSerializer.cs +++ b/src/persistence/Elsa.Persistence.YesSql/CustomJsonContentSerializer.cs @@ -1,11 +1,14 @@ -using System; +using System; + using Newtonsoft.Json; using Newtonsoft.Json.Serialization; + using NodaTime; using NodaTime.Serialization.JsonNet; + using YesSql; -namespace Elsa.Data.Services +namespace Elsa.Persistence.YesSql { public class CustomJsonContentSerializer : IContentSerializer { @@ -32,4 +35,4 @@ namespace Elsa.Data.Services public dynamic? DeserializeDynamic(string content) => JsonConvert.DeserializeObject(content, JsonSettings); public string Serialize(object item) => JsonConvert.SerializeObject(item, JsonSettings); } -} \ No newline at end of file +} diff --git a/src/core/Elsa.Abstractions/Data/DataMigration.cs b/src/persistence/Elsa.Persistence.YesSql/Data/DataMigration.cs similarity index 78% rename from src/core/Elsa.Abstractions/Data/DataMigration.cs rename to src/persistence/Elsa.Persistence.YesSql/Data/DataMigration.cs index 0b9cff56d..8220db167 100644 --- a/src/core/Elsa.Abstractions/Data/DataMigration.cs +++ b/src/persistence/Elsa.Persistence.YesSql/Data/DataMigration.cs @@ -1,6 +1,6 @@ -using YesSql.Sql; +using YesSql.Sql; -namespace Elsa.Data +namespace Elsa.Persistence.YesSql.Data { /// /// Represents a database migration. @@ -9,4 +9,4 @@ namespace Elsa.Data { public ISchemaBuilder SchemaBuilder { get; set; } = default!; } -} \ No newline at end of file +} diff --git a/src/core/Elsa.Abstractions/Data/IDataMigration.cs b/src/persistence/Elsa.Persistence.YesSql/Data/IDataMigration.cs similarity index 83% rename from src/core/Elsa.Abstractions/Data/IDataMigration.cs rename to src/persistence/Elsa.Persistence.YesSql/Data/IDataMigration.cs index 7f33bb108..8d49f4a92 100644 --- a/src/core/Elsa.Abstractions/Data/IDataMigration.cs +++ b/src/persistence/Elsa.Persistence.YesSql/Data/IDataMigration.cs @@ -1,6 +1,6 @@ -using YesSql.Sql; +using YesSql.Sql; -namespace Elsa.Data +namespace Elsa.Persistence.YesSql.Data { /// /// Represents a contract for a database migration. @@ -12,4 +12,4 @@ namespace Elsa.Data /// ISchemaBuilder SchemaBuilder { get; set; } } -} \ No newline at end of file +} diff --git a/src/core/Elsa.Abstractions/Data/IScopedIndexProvider.cs b/src/persistence/Elsa.Persistence.YesSql/Data/IScopedIndexProvider.cs similarity index 82% rename from src/core/Elsa.Abstractions/Data/IScopedIndexProvider.cs rename to src/persistence/Elsa.Persistence.YesSql/Data/IScopedIndexProvider.cs index 799d33d20..a8b258048 100644 --- a/src/core/Elsa.Abstractions/Data/IScopedIndexProvider.cs +++ b/src/persistence/Elsa.Persistence.YesSql/Data/IScopedIndexProvider.cs @@ -1,6 +1,6 @@ -using YesSql.Indexes; +using YesSql.Indexes; -namespace Elsa.Data +namespace Elsa.Persistence.YesSql.Data { /// /// Represents a contract that used to denote an that needs to be resolved by the DI and registered @@ -9,4 +9,4 @@ namespace Elsa.Data public interface IScopedIndexProvider : IIndexProvider { } -} \ No newline at end of file +} diff --git a/src/persistence/Elsa.Persistence.YesSql/Elsa.Persistence.YesSql.csproj b/src/persistence/Elsa.Persistence.YesSql/Elsa.Persistence.YesSql.csproj new file mode 100644 index 000000000..faa0e7022 --- /dev/null +++ b/src/persistence/Elsa.Persistence.YesSql/Elsa.Persistence.YesSql.csproj @@ -0,0 +1,37 @@ + + + + netstandard2.0 + latest + Elsa.Persistence.YesSql + 1.0.0 + Elsa Contributors + + Elsa is a set of workflow libraries and tools that enable super-fast workflowing capabilities in any .NET Core application. + This package provides a YesSql persistence provider. + + 2020 + https://github.com/elsa-workflows/elsa-core + https://github.com/elsa-workflows/elsa-core + GitHub + elsa, workflows, orchard + icon.png + enable + + + + + True + + + + + + + + + + + + + diff --git a/src/persistence/Elsa.Persistence.YesSql/IServiceCollectionExtensions.cs b/src/persistence/Elsa.Persistence.YesSql/IServiceCollectionExtensions.cs new file mode 100644 index 000000000..8c6f3f2aa --- /dev/null +++ b/src/persistence/Elsa.Persistence.YesSql/IServiceCollectionExtensions.cs @@ -0,0 +1,72 @@ +using System; +using System.Linq; + +using Elsa.Data; +using Elsa.Data.Services; +using Elsa.Persistence.YesSql.Data; +using Elsa.Persistence.YesSql.Indexes; +using Elsa.Persistence.YesSql.Services; +using Elsa.Repositories; +using Elsa.Runtime; +using Elsa.WorkflowProviders; + +using Microsoft.Extensions.DependencyInjection; + +using YesSql; +using YesSql.Indexes; + +namespace Elsa.Persistence.YesSql +{ + public static class IServiceCollectionExtensions + { + public static IServiceCollection AddElsaPersistenceYesSql(this IServiceCollection services, Action configure) + { + // Scoped, because IMediator is registered as Scoped and IIdGenerator could also be registered as Scoped + services.AddScoped() + .AddScoped() + .AddWorkflowProvider() + .AddSingleton(sp => CreateStore(sp, configure)) + .AddScoped(CreateSession) + .AddScoped() + .AddStartupTask() + .AddStartupTask() + .AddDataMigration() + .AddIndexProvider() + .AddIndexProvider(); + + return services; + } + + public static IServiceCollection AddIndexProvider(this IServiceCollection services) where T : class, IIndexProvider => services.AddSingleton(); + public static IServiceCollection AddScopedIndexProvider(this IServiceCollection services) where T : class, IIndexProvider => services.AddScoped(); + public static IServiceCollection AddDataMigration(this IServiceCollection services) where T : class, IDataMigration => services.AddScoped(); + + private static IStore CreateStore( + IServiceProvider serviceProvider, + Action configure) + { + var configuration = new Configuration { ContentSerializer = new CustomJsonContentSerializer() }; + configure(serviceProvider, configuration); + + // TODO: The following line is a temporary workaround until the bug in YesSql is fixed: https://github.com/sebastienros/yessql/pull/280 + var store = StoreFactory.CreateAndInitializeAsync(configuration).GetAwaiter().GetResult(); + //var store = StoreFactory.Create(configuration); + + var indexes = serviceProvider.GetServices(); + store.RegisterIndexes(indexes); + + return store; + } + + private static ISession CreateSession(IServiceProvider serviceProvider) + { + var store = serviceProvider.GetRequiredService(); + var session = store.CreateSession(); + var scopedServices = serviceProvider.GetServices().Cast().ToArray(); + + session.RegisterIndexes(scopedServices); + + return session; + } + } +} diff --git a/src/core/Elsa.Core/Indexes/WorkflowDefinitionIndex.cs b/src/persistence/Elsa.Persistence.YesSql/Indexes/WorkflowDefinitionIndex.cs similarity index 95% rename from src/core/Elsa.Core/Indexes/WorkflowDefinitionIndex.cs rename to src/persistence/Elsa.Persistence.YesSql/Indexes/WorkflowDefinitionIndex.cs index 6059b60a5..0a386e34d 100644 --- a/src/core/Elsa.Core/Indexes/WorkflowDefinitionIndex.cs +++ b/src/persistence/Elsa.Persistence.YesSql/Indexes/WorkflowDefinitionIndex.cs @@ -1,8 +1,9 @@ -using Elsa.Data; +using Elsa.Data; using Elsa.Models; + using YesSql.Indexes; -namespace Elsa.Indexes +namespace Elsa.Persistence.YesSql.Indexes { public class WorkflowDefinitionIndex : MapIndex { @@ -14,7 +15,7 @@ namespace Elsa.Indexes public bool IsPublished { get; set; } public bool IsEnabled { get; set; } } - + public class WorkflowDefinitionIndexProvider : IndexProvider { public WorkflowDefinitionIndexProvider() => CollectionName = CollectionNames.WorkflowDefinitions; @@ -36,4 +37,4 @@ namespace Elsa.Indexes ); } } -} \ No newline at end of file +} diff --git a/src/core/Elsa.Core/Indexes/WorkflowInstanceIndex.cs b/src/persistence/Elsa.Persistence.YesSql/Indexes/WorkflowInstanceIndex.cs similarity index 98% rename from src/core/Elsa.Core/Indexes/WorkflowInstanceIndex.cs rename to src/persistence/Elsa.Persistence.YesSql/Indexes/WorkflowInstanceIndex.cs index 0a227fff4..6a1824c9c 100644 --- a/src/core/Elsa.Core/Indexes/WorkflowInstanceIndex.cs +++ b/src/persistence/Elsa.Persistence.YesSql/Indexes/WorkflowInstanceIndex.cs @@ -1,10 +1,12 @@ using System; using System.Linq; + using Elsa.Data; using Elsa.Models; + using YesSql.Indexes; -namespace Elsa.Indexes +namespace Elsa.Persistence.YesSql.Indexes { public class WorkflowInstanceIndex : MapIndex { @@ -50,7 +52,7 @@ namespace Elsa.Indexes { if (workflowInstance.Status != WorkflowStatus.Suspended || !workflowInstance.BlockingActivities.Any()) return default; - + return workflowInstance.BlockingActivities .Select( activity => new WorkflowInstanceBlockingActivitiesIndex @@ -65,4 +67,4 @@ namespace Elsa.Indexes }); } } -} \ No newline at end of file +} diff --git a/src/core/Elsa.Core/Migrations.cs b/src/persistence/Elsa.Persistence.YesSql/Migrations.cs similarity index 92% rename from src/core/Elsa.Core/Migrations.cs rename to src/persistence/Elsa.Persistence.YesSql/Migrations.cs index 130f12ae7..d6bb8bc6f 100644 --- a/src/core/Elsa.Core/Migrations.cs +++ b/src/persistence/Elsa.Persistence.YesSql/Migrations.cs @@ -1,9 +1,11 @@ -using System.Data; +using System.Data; using Elsa.Data; -using Elsa.Indexes; +using Elsa.Persistence.YesSql.Data; +using Elsa.Persistence.YesSql.Indexes; + using YesSql.Sql; -namespace Elsa +namespace Elsa.Persistence.YesSql { public class Migrations : DataMigration { diff --git a/src/core/Elsa.Core/Data/Services/DataMigrationManager.cs b/src/persistence/Elsa.Persistence.YesSql/Services/DataMigrationManager.cs similarity index 98% rename from src/core/Elsa.Core/Data/Services/DataMigrationManager.cs rename to src/persistence/Elsa.Persistence.YesSql/Services/DataMigrationManager.cs index 34d00de1d..fac09f710 100644 --- a/src/core/Elsa.Core/Data/Services/DataMigrationManager.cs +++ b/src/persistence/Elsa.Persistence.YesSql/Services/DataMigrationManager.cs @@ -3,13 +3,18 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Threading.Tasks; + +using Elsa.Data; using Elsa.Data.Documents; using Elsa.Extensions; +using Elsa.Persistence.YesSql.Data; + using Microsoft.Extensions.Logging; + using YesSql; using YesSql.Sql; -namespace Elsa.Data.Services +namespace Elsa.Persistence.YesSql.Services { /// /// Represents a class that manages the database migrations. @@ -241,4 +246,4 @@ namespace Elsa.Data.Services return returnType != null && (returnType == typeof(Task) || returnType == typeof(int)) ? methodInfo : null; } } -} \ No newline at end of file +} diff --git a/src/core/Elsa.Core/Data/Services/DatabaseInitializer.cs b/src/persistence/Elsa.Persistence.YesSql/Services/DatabaseInitializer.cs similarity index 77% rename from src/core/Elsa.Core/Data/Services/DatabaseInitializer.cs rename to src/persistence/Elsa.Persistence.YesSql/Services/DatabaseInitializer.cs index 05c25ebfd..3bbfb7796 100644 --- a/src/core/Elsa.Core/Data/Services/DatabaseInitializer.cs +++ b/src/persistence/Elsa.Persistence.YesSql/Services/DatabaseInitializer.cs @@ -1,9 +1,15 @@ -using System.Threading; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; using System.Threading.Tasks; + +using Elsa.Data; using Elsa.Services; + using YesSql; -namespace Elsa.Data.Services +namespace Elsa.Persistence.YesSql.Services { public class DatabaseInitializer : IStartupTask { @@ -13,11 +19,11 @@ namespace Elsa.Data.Services { _store = store; } - + public async Task ExecuteAsync(CancellationToken cancellationToken = default) { await _store.InitializeCollectionAsync(CollectionNames.WorkflowDefinitions); await _store.InitializeCollectionAsync(CollectionNames.WorkflowInstances); } } -} \ No newline at end of file +} diff --git a/src/core/Elsa.Core/Services/WorkflowDefinitionManager.cs b/src/persistence/Elsa.Persistence.YesSql/YesSqlWorkflowDefinitionRepository.cs similarity index 57% rename from src/core/Elsa.Core/Services/WorkflowDefinitionManager.cs rename to src/persistence/Elsa.Persistence.YesSql/YesSqlWorkflowDefinitionRepository.cs index 6669a9e36..e1f6098e3 100644 --- a/src/core/Elsa.Core/Services/WorkflowDefinitionManager.cs +++ b/src/persistence/Elsa.Persistence.YesSql/YesSqlWorkflowDefinitionRepository.cs @@ -1,22 +1,25 @@ -using System; +using System; using System.Collections.Generic; using System.Linq.Expressions; using System.Threading; using System.Threading.Tasks; + using Elsa.Data; -using Elsa.Extensions; using Elsa.Models; +using Elsa.Persistence.YesSql.Indexes; +using Elsa.Repositories; + using YesSql; using YesSql.Indexes; -namespace Elsa.Services +namespace Elsa.Persistence.YesSql { - public class WorkflowDefinitionManager : IWorkflowDefinitionManager + public class YesSqlWorkflowDefinitionRepository : IWorkflowDefinitionRepository { private readonly ISession _session; - private readonly IIdGenerator _idGenerator; + private readonly Elsa.Services.IIdGenerator _idGenerator; - public WorkflowDefinitionManager(ISession session, IIdGenerator idGenerator) + public YesSqlWorkflowDefinitionRepository(ISession session, Elsa.Services.IIdGenerator idGenerator) { _session = session; _idGenerator = idGenerator; @@ -36,20 +39,19 @@ namespace Elsa.Services } public async Task CountAsync(VersionOptions? version = default, CancellationToken cancellationToken = default) => - await Query() - .WithVersion(version ?? VersionOptions.Latest) + await WithVersion(Query(), version ?? VersionOptions.Latest) .CountAsync(); - + public async Task> ListAsync(int? skip = default, int? take = default, VersionOptions? version = default, CancellationToken cancellationToken = default) { - var query = Query().WithVersion(version ?? VersionOptions.Latest); + var query = WithVersion(Query(), version ?? VersionOptions.Latest); if (skip != null) query = query.Skip(skip.Value); if (take != null) query = query.Take(take.Value); - + return await query.ListAsync(); } @@ -71,5 +73,42 @@ namespace Elsa.Services return workflowDefinition; } + + public Task GetAsync(string workflowDefinitionId, VersionOptions version, CancellationToken cancellationToken = default) + { + var query = Query(x => x.WorkflowDefinitionId == workflowDefinitionId); + + return WithVersion(query, version).FirstOrDefaultAsync(); + } + + public Task GetByVersionIdAsync(string workflowDefinitionVersionId, CancellationToken cancellationToken = default) + { + return Query(x => x.WorkflowDefinitionVersionId == workflowDefinitionVersionId).FirstOrDefaultAsync(); + } + + private IQuery WithVersion(IQuery query, + VersionOptions version) + { + var index = query.With(); + + if (version.IsDraft) + query = index.Where(x => !x.IsPublished); + else if (version.IsLatest) + query = index.Where(x => x.IsLatest); + else if (version.IsPublished) + query = index.Where(x => x.IsPublished); + else if (version.IsLatestOrPublished) + query = index.Where(x => x.IsPublished || x.IsLatest); + else if (version.AllVersions) + { + // Nothing to filter. + } + else if (version.Version > 0) + query = index.Where(x => x.Version == version.Version); + + return index.OrderByDescending(x => x.Version); + } + + } -} \ No newline at end of file +} diff --git a/src/persistence/Elsa.Persistence.YesSql/YesSqlWorkflowInstanceRepository.cs b/src/persistence/Elsa.Persistence.YesSql/YesSqlWorkflowInstanceRepository.cs new file mode 100644 index 000000000..cdc892699 --- /dev/null +++ b/src/persistence/Elsa.Persistence.YesSql/YesSqlWorkflowInstanceRepository.cs @@ -0,0 +1,100 @@ +using System; +using System.Collections.Generic; +using System.Linq.Expressions; +using System.Threading; +using System.Threading.Tasks; + +using Elsa.Data; +using Elsa.Events; +using Elsa.Models; +using Elsa.Persistence.YesSql.Indexes; +using Elsa.Repositories; + +using MediatR; + +using YesSql; +using YesSql.Indexes; + +namespace Elsa.Persistence.YesSql +{ + public class YesSqlWorkflowInstanceRepository : IWorkflowInstanceRepository + { + private readonly ISession _session; + private readonly IMediator _mediator; + + public YesSqlWorkflowInstanceRepository(ISession session, IMediator mediator) + { + _session = session; + _mediator = mediator; + } + + public async Task SaveAsync(WorkflowInstance workflowInstance, CancellationToken cancellationToken = default) + { + _session.Save(workflowInstance, CollectionNames.WorkflowInstances); + await _session.CommitAsync(); + await _mediator.Publish(new WorkflowInstanceSaved(workflowInstance), cancellationToken); + } + + public async Task DeleteAsync(WorkflowInstance workflowInstance, CancellationToken cancellationToken = default) + { + _session.Delete(workflowInstance, CollectionNames.WorkflowInstances); + await _session.CommitAsync(); + await _mediator.Publish(new WorkflowInstanceDeleted(workflowInstance), cancellationToken); + } + + public async Task IsWorkflowIsAlreadyExecutingAsync(string? tenantId, string workflowDefinitionId, CancellationToken cancellationToken = default) + { + var instance = await Query(index => index.WorkflowDefinitionId == workflowDefinitionId && index.TenantId == tenantId && (index.WorkflowStatus == WorkflowStatus.Running || index.WorkflowStatus == WorkflowStatus.Suspended)) + .FirstOrDefaultAsync(); + + return instance != null; + } + + public Task GetByIdAsync(string workflowInstanceId, CancellationToken cancellationToken = default) + { + return Query(x => x.WorkflowInstanceId == workflowInstanceId).FirstOrDefaultAsync(); + } + + public Task> ListAsync(int page, int pageSize, CancellationToken cancellationToken = default) { + return Query().Skip(page * pageSize).Take(pageSize).ListAsync(); + } + + public Task> ListByBlockingActivityTypeAsync(string activityType, CancellationToken cancellationToken = default) + { + return Query(x => x.ActivityType == activityType).ListAsync(); + } + + public Task> ListByDefinitionAndStatusAsync(string workflowDefinitionId, string? tenantId, WorkflowStatus workflowStatus, CancellationToken cancellationToken = default) + { + return Query(x => x.WorkflowDefinitionId == workflowDefinitionId && x.TenantId == tenantId && x.WorkflowStatus == workflowStatus).ListAsync(); + } + + public Task> ListByStatusAsync(WorkflowStatus workflowStatus, CancellationToken cancellationToken = default) + { + return Query(x => x.WorkflowStatus == workflowStatus).ListAsync(); + } + + public Task> ListByDefinitionAsync( string workflowDefinitionId,string? tenantId,CancellationToken cancellationToken = default) + { + return Query(x => x.WorkflowDefinitionId == workflowDefinitionId && x.TenantId == tenantId).ListAsync(); + } + + public Task GetByCorrelationIdAsync(string correlationId, WorkflowStatus status, CancellationToken cancellationToken = default) + { + return Query(x => x.CorrelationId == correlationId && x.WorkflowStatus == status).FirstOrDefaultAsync(); + } + + public Task> ListByCorrelationIdAsync(string correlationId, WorkflowStatus status, CancellationToken cancellationToken = default) + { + return Query(x => x.CorrelationId == correlationId && x.WorkflowStatus == status).ListAsync(); + } + + public Task CountAsync(CancellationToken cancellationToken = default) + { + return Query().CountAsync(); + } + + private IQuery Query() where TIndex : class, IIndex => _session.Query(CollectionNames.WorkflowInstances); + private IQuery Query(Expression> predicate) where TIndex : class, IIndex => _session.Query(predicate, CollectionNames.WorkflowInstances); + } +} diff --git a/src/persistence/Elsa.Persistence.YesSql/icon.png b/src/persistence/Elsa.Persistence.YesSql/icon.png new file mode 100644 index 000000000..28dbaafbf Binary files /dev/null and b/src/persistence/Elsa.Persistence.YesSql/icon.png differ diff --git a/src/samples/aspnet/Elsa.Samples.ContextualWorkflowHttp/Elsa.Samples.ContextualWorkflowHttp.csproj b/src/samples/aspnet/Elsa.Samples.ContextualWorkflowHttp/Elsa.Samples.ContextualWorkflowHttp.csproj index f2949a548..3f150c1e4 100644 --- a/src/samples/aspnet/Elsa.Samples.ContextualWorkflowHttp/Elsa.Samples.ContextualWorkflowHttp.csproj +++ b/src/samples/aspnet/Elsa.Samples.ContextualWorkflowHttp/Elsa.Samples.ContextualWorkflowHttp.csproj @@ -6,8 +6,13 @@ false + + + + + diff --git a/src/samples/aspnet/Elsa.Samples.ContextualWorkflowHttp/Migrations.cs b/src/samples/aspnet/Elsa.Samples.ContextualWorkflowHttp/Migrations.cs index 7eab87177..9063bdf11 100644 --- a/src/samples/aspnet/Elsa.Samples.ContextualWorkflowHttp/Migrations.cs +++ b/src/samples/aspnet/Elsa.Samples.ContextualWorkflowHttp/Migrations.cs @@ -1,4 +1,5 @@ -using Elsa.Data; +using Elsa.Data; +using Elsa.Persistence.YesSql.Data; using Elsa.Samples.ContextualWorkflowHttp.Indexes; using YesSql.Sql; diff --git a/src/samples/aspnet/Elsa.Samples.ContextualWorkflowHttp/Startup.cs b/src/samples/aspnet/Elsa.Samples.ContextualWorkflowHttp/Startup.cs index d32e386ff..8e05d1456 100644 --- a/src/samples/aspnet/Elsa.Samples.ContextualWorkflowHttp/Startup.cs +++ b/src/samples/aspnet/Elsa.Samples.ContextualWorkflowHttp/Startup.cs @@ -1,8 +1,11 @@ using Elsa.Samples.ContextualWorkflowHttp.Indexes; using Elsa.Samples.ContextualWorkflowHttp.WorkflowContextProviders; using Elsa.Samples.ContextualWorkflowHttp.Workflows; +using Elsa.Persistence.YesSql; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; +using YesSql.Provider.Sqlite; +using System.Data; namespace Elsa.Samples.ContextualWorkflowHttp { @@ -12,6 +15,7 @@ namespace Elsa.Samples.ContextualWorkflowHttp { services .AddElsa() + .AddElsaPersistenceYesSql((sp, config) => config.UseSqLite("Data Source=elsa.db;Cache=Shared", IsolationLevel.ReadUncommitted)) .AddHttpActivities() .AddConsoleActivities() .AddDataMigration() diff --git a/src/samples/aspnet/Elsa.Samples.CorrelationHttp/Elsa.Samples.CorrelationHttp.csproj b/src/samples/aspnet/Elsa.Samples.CorrelationHttp/Elsa.Samples.CorrelationHttp.csproj index 30563aa3f..cc3f0c630 100644 --- a/src/samples/aspnet/Elsa.Samples.CorrelationHttp/Elsa.Samples.CorrelationHttp.csproj +++ b/src/samples/aspnet/Elsa.Samples.CorrelationHttp/Elsa.Samples.CorrelationHttp.csproj @@ -7,6 +7,7 @@ + diff --git a/src/samples/aspnet/Elsa.Samples.CorrelationHttp/Startup.cs b/src/samples/aspnet/Elsa.Samples.CorrelationHttp/Startup.cs index 194b18331..8607dae16 100644 --- a/src/samples/aspnet/Elsa.Samples.CorrelationHttp/Startup.cs +++ b/src/samples/aspnet/Elsa.Samples.CorrelationHttp/Startup.cs @@ -1,3 +1,4 @@ +using Elsa.Persistence.InMemory; using Elsa.Samples.CorrelationHttp.Workflows; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; @@ -10,6 +11,7 @@ namespace Elsa.Samples.CorrelationHttp { services .AddElsa() + .AddElsaPersistenceInMemory() .AddHttpActivities() .AddConsoleActivities() .AddWorkflow(); diff --git a/src/samples/aspnet/Elsa.Samples.CustomActivities/Elsa.Samples.CustomActivities.csproj b/src/samples/aspnet/Elsa.Samples.CustomActivities/Elsa.Samples.CustomActivities.csproj index 30563aa3f..cc3f0c630 100644 --- a/src/samples/aspnet/Elsa.Samples.CustomActivities/Elsa.Samples.CustomActivities.csproj +++ b/src/samples/aspnet/Elsa.Samples.CustomActivities/Elsa.Samples.CustomActivities.csproj @@ -7,6 +7,7 @@ + diff --git a/src/samples/aspnet/Elsa.Samples.CustomActivities/Startup.cs b/src/samples/aspnet/Elsa.Samples.CustomActivities/Startup.cs index 8c77d091c..2eab94840 100644 --- a/src/samples/aspnet/Elsa.Samples.CustomActivities/Startup.cs +++ b/src/samples/aspnet/Elsa.Samples.CustomActivities/Startup.cs @@ -1,6 +1,7 @@ +using Elsa.Persistence.InMemory; + using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; -using YesSql.Provider.Sqlite; namespace Elsa.Samples.CustomActivities { @@ -9,7 +10,8 @@ namespace Elsa.Samples.CustomActivities public void ConfigureServices(IServiceCollection services) { services - .AddElsa(option => option.UsePersistence(db => db.UseSqLite("Data Source=elsa.db;Cache=Shared"))) + .AddElsa() + .AddElsaPersistenceInMemory() .AddHttpActivities() .AddActivity() .AddWorkflow(); diff --git a/src/samples/aspnet/Elsa.Samples.ForkJoinTimerAndSignalHttp/Elsa.Samples.ForkJoinTimerAndSignalHttp.csproj b/src/samples/aspnet/Elsa.Samples.ForkJoinTimerAndSignalHttp/Elsa.Samples.ForkJoinTimerAndSignalHttp.csproj index 9b8749128..44152dfae 100644 --- a/src/samples/aspnet/Elsa.Samples.ForkJoinTimerAndSignalHttp/Elsa.Samples.ForkJoinTimerAndSignalHttp.csproj +++ b/src/samples/aspnet/Elsa.Samples.ForkJoinTimerAndSignalHttp/Elsa.Samples.ForkJoinTimerAndSignalHttp.csproj @@ -6,6 +6,7 @@ - + + diff --git a/src/samples/aspnet/Elsa.Samples.ForkJoinTimerAndSignalHttp/Startup.cs b/src/samples/aspnet/Elsa.Samples.ForkJoinTimerAndSignalHttp/Startup.cs index 6f224bc5d..db42a50b3 100644 --- a/src/samples/aspnet/Elsa.Samples.ForkJoinTimerAndSignalHttp/Startup.cs +++ b/src/samples/aspnet/Elsa.Samples.ForkJoinTimerAndSignalHttp/Startup.cs @@ -1,3 +1,4 @@ +using Elsa.Persistence.InMemory; using Elsa.Samples.ForkJoinTimerAndSignalHttp.BackgroundTasks; using Elsa.Samples.ForkJoinTimerAndSignalHttp.Workflows; using Microsoft.AspNetCore.Builder; @@ -14,6 +15,7 @@ namespace Elsa.Samples.ForkJoinTimerAndSignalHttp services .AddElsa() + .AddElsaPersistenceInMemory() .AddConsoleActivities() .AddTimerActivities() .AddHostedService>() diff --git a/src/samples/aspnet/Elsa.Samples.HelloWorldHttp/Elsa.Samples.HelloWorldHttp.csproj b/src/samples/aspnet/Elsa.Samples.HelloWorldHttp/Elsa.Samples.HelloWorldHttp.csproj index 30563aa3f..cc3f0c630 100644 --- a/src/samples/aspnet/Elsa.Samples.HelloWorldHttp/Elsa.Samples.HelloWorldHttp.csproj +++ b/src/samples/aspnet/Elsa.Samples.HelloWorldHttp/Elsa.Samples.HelloWorldHttp.csproj @@ -7,6 +7,7 @@ + diff --git a/src/samples/aspnet/Elsa.Samples.HelloWorldHttp/Startup.cs b/src/samples/aspnet/Elsa.Samples.HelloWorldHttp/Startup.cs index b0ee75523..ac068fb57 100644 --- a/src/samples/aspnet/Elsa.Samples.HelloWorldHttp/Startup.cs +++ b/src/samples/aspnet/Elsa.Samples.HelloWorldHttp/Startup.cs @@ -1,3 +1,5 @@ +using Elsa.Persistence.InMemory; + using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; @@ -9,6 +11,7 @@ namespace Elsa.Samples.HelloWorldHttp { services .AddElsa() + .AddElsaPersistenceInMemory() .AddHttpActivities() .AddWorkflow(); } diff --git a/src/samples/aspnet/Elsa.Samples.Interrupts/Activities/Sleep.cs b/src/samples/aspnet/Elsa.Samples.Interrupts/Activities/Sleep.cs index 65ac228dd..e835e8f43 100644 --- a/src/samples/aspnet/Elsa.Samples.Interrupts/Activities/Sleep.cs +++ b/src/samples/aspnet/Elsa.Samples.Interrupts/Activities/Sleep.cs @@ -1,6 +1,7 @@ -using Elsa.Activities.Timers; +using Elsa.Activities.Timers; using Elsa.Activities.Timers.Services; using Elsa.Attributes; +using Elsa.Repositories; using Elsa.Services; using NodaTime; @@ -9,7 +10,7 @@ namespace Elsa.Samples.Interrupts.Activities [Activity] public class Sleep : Timer { - public Sleep(IWorkflowInstanceManager workflowInstanceManager, IWorkflowScheduler workflowScheduler, IClock clock) : base(clock) + public Sleep(IWorkflowInstanceRepository workflowInstanceRepository, IWorkflowScheduler workflowScheduler, IClock clock) : base(clock) { } } diff --git a/src/samples/aspnet/Elsa.Samples.Interrupts/Elsa.Samples.Interrupts.csproj b/src/samples/aspnet/Elsa.Samples.Interrupts/Elsa.Samples.Interrupts.csproj index 06e0c8e81..5124a3b41 100644 --- a/src/samples/aspnet/Elsa.Samples.Interrupts/Elsa.Samples.Interrupts.csproj +++ b/src/samples/aspnet/Elsa.Samples.Interrupts/Elsa.Samples.Interrupts.csproj @@ -8,6 +8,7 @@ + diff --git a/src/samples/aspnet/Elsa.Samples.Interrupts/Startup.cs b/src/samples/aspnet/Elsa.Samples.Interrupts/Startup.cs index 19bb61269..00d194db9 100644 --- a/src/samples/aspnet/Elsa.Samples.Interrupts/Startup.cs +++ b/src/samples/aspnet/Elsa.Samples.Interrupts/Startup.cs @@ -1,3 +1,4 @@ +using Elsa.Persistence.InMemory; using Elsa.Samples.Interrupts.Activities; using Elsa.Samples.Interrupts.Workflows; using Microsoft.AspNetCore.Builder; @@ -14,6 +15,7 @@ namespace Elsa.Samples.Interrupts services .AddElsa() + .AddElsaPersistenceInMemory() .AddConsoleActivities() .AddHttpActivities() .AddTimerActivities() diff --git a/src/samples/aspnet/Elsa.Samples.ReadModelHttp/Elsa.Samples.ReadModelHttp.csproj b/src/samples/aspnet/Elsa.Samples.ReadModelHttp/Elsa.Samples.ReadModelHttp.csproj index f215cd4b7..b004a9e65 100644 --- a/src/samples/aspnet/Elsa.Samples.ReadModelHttp/Elsa.Samples.ReadModelHttp.csproj +++ b/src/samples/aspnet/Elsa.Samples.ReadModelHttp/Elsa.Samples.ReadModelHttp.csproj @@ -7,6 +7,7 @@ + diff --git a/src/samples/aspnet/Elsa.Samples.ReadModelHttp/Startup.cs b/src/samples/aspnet/Elsa.Samples.ReadModelHttp/Startup.cs index 1e1406853..6a55a1259 100644 --- a/src/samples/aspnet/Elsa.Samples.ReadModelHttp/Startup.cs +++ b/src/samples/aspnet/Elsa.Samples.ReadModelHttp/Startup.cs @@ -1,7 +1,7 @@ +using Elsa.Persistence.InMemory; using Elsa.Samples.ReadModelHttp.Workflows; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; -using YesSql.Provider.Sqlite; namespace Elsa.Samples.ReadModelHttp { @@ -10,7 +10,8 @@ namespace Elsa.Samples.ReadModelHttp public void ConfigureServices(IServiceCollection services) { services - .AddElsa(option => option.UsePersistence(db => db.UseSqLite("Data Source=elsa.db;Cache=Shared"))) + .AddElsa() + .AddElsaPersistenceInMemory() .AddHttpActivities() .AddConsoleActivities() .AddWorkflow(); diff --git a/src/samples/console/Elsa.Samples.DeclarativeCompositeActivitiesConsole/Elsa.Samples.DeclarativeCompositeActivitiesConsole.csproj b/src/samples/console/Elsa.Samples.DeclarativeCompositeActivitiesConsole/Elsa.Samples.DeclarativeCompositeActivitiesConsole.csproj index 1e354fe70..ad524e643 100644 --- a/src/samples/console/Elsa.Samples.DeclarativeCompositeActivitiesConsole/Elsa.Samples.DeclarativeCompositeActivitiesConsole.csproj +++ b/src/samples/console/Elsa.Samples.DeclarativeCompositeActivitiesConsole/Elsa.Samples.DeclarativeCompositeActivitiesConsole.csproj @@ -12,6 +12,7 @@ + diff --git a/src/samples/console/Elsa.Samples.DeclarativeCompositeActivitiesConsole/Program.cs b/src/samples/console/Elsa.Samples.DeclarativeCompositeActivitiesConsole/Program.cs index 7a29093e9..a11899bef 100644 --- a/src/samples/console/Elsa.Samples.DeclarativeCompositeActivitiesConsole/Program.cs +++ b/src/samples/console/Elsa.Samples.DeclarativeCompositeActivitiesConsole/Program.cs @@ -1,5 +1,6 @@ -using System.Threading.Tasks; +using System.Threading.Tasks; using Elsa.Models; +using Elsa.Persistence.InMemory; using Elsa.Scripting.Liquid.Services; using Elsa.Serialization; using Elsa.Services; @@ -17,6 +18,7 @@ namespace Elsa.Samples.DeclarativeCompositeActivitiesConsole // Create a service container with Elsa services. var services = new ServiceCollection() .AddElsa() + .AddElsaPersistenceInMemory() .AddConsoleActivities() .BuildServiceProvider(); diff --git a/src/samples/console/Elsa.Samples.FileBasedWorkflow/Elsa.Samples.FileBasedWorkflow.csproj b/src/samples/console/Elsa.Samples.FileBasedWorkflow/Elsa.Samples.FileBasedWorkflow.csproj index b5a89fc88..1ed5eb730 100644 --- a/src/samples/console/Elsa.Samples.FileBasedWorkflow/Elsa.Samples.FileBasedWorkflow.csproj +++ b/src/samples/console/Elsa.Samples.FileBasedWorkflow/Elsa.Samples.FileBasedWorkflow.csproj @@ -12,6 +12,7 @@ + diff --git a/src/samples/console/Elsa.Samples.FileBasedWorkflow/Program.cs b/src/samples/console/Elsa.Samples.FileBasedWorkflow/Program.cs index e5e630432..0a8b234a2 100644 --- a/src/samples/console/Elsa.Samples.FileBasedWorkflow/Program.cs +++ b/src/samples/console/Elsa.Samples.FileBasedWorkflow/Program.cs @@ -1,7 +1,8 @@ -using System.IO; +using System.IO; using System.Threading.Tasks; using Elsa.Extensions; using Elsa.Models; +using Elsa.Persistence.InMemory; using Elsa.Services; using Microsoft.Extensions.DependencyInjection; using Storage.Net; @@ -21,6 +22,7 @@ namespace Elsa.Samples.FileBasedWorkflow // Create a service container with Elsa services. var services = new ServiceCollection() .AddElsa(options => options.UseStorage(() => StorageFactory.Blobs.DirectoryFiles(currentDirectory))) + .AddElsaPersistenceInMemory() .AddConsoleActivities() .BuildServiceProvider(); diff --git a/src/samples/console/Elsa.Samples.ForLoopConsole/Elsa.Samples.ForLoopConsole.csproj b/src/samples/console/Elsa.Samples.ForLoopConsole/Elsa.Samples.ForLoopConsole.csproj index e4cdfd97b..b22c3b4a1 100644 --- a/src/samples/console/Elsa.Samples.ForLoopConsole/Elsa.Samples.ForLoopConsole.csproj +++ b/src/samples/console/Elsa.Samples.ForLoopConsole/Elsa.Samples.ForLoopConsole.csproj @@ -12,6 +12,7 @@ + diff --git a/src/samples/console/Elsa.Samples.ForLoopConsole/Program.cs b/src/samples/console/Elsa.Samples.ForLoopConsole/Program.cs index 7d148e63e..db6c44fe6 100644 --- a/src/samples/console/Elsa.Samples.ForLoopConsole/Program.cs +++ b/src/samples/console/Elsa.Samples.ForLoopConsole/Program.cs @@ -1,4 +1,6 @@ -using System.Threading.Tasks; +using System.Threading.Tasks; + +using Elsa.Persistence.InMemory; using Elsa.Services; using Microsoft.Extensions.DependencyInjection; @@ -14,6 +16,7 @@ namespace Elsa.Samples.ForLoopConsole // Create a service container with Elsa services. var services = new ServiceCollection() .AddElsa() + .AddElsaPersistenceInMemory() .AddConsoleActivities() .AddWorkflow() .BuildServiceProvider(); diff --git a/src/samples/console/Elsa.Samples.GoBackConsole/Elsa.Samples.GoBackConsole.csproj b/src/samples/console/Elsa.Samples.GoBackConsole/Elsa.Samples.GoBackConsole.csproj index 636f8d393..132d8fd66 100644 --- a/src/samples/console/Elsa.Samples.GoBackConsole/Elsa.Samples.GoBackConsole.csproj +++ b/src/samples/console/Elsa.Samples.GoBackConsole/Elsa.Samples.GoBackConsole.csproj @@ -13,6 +13,7 @@ + diff --git a/src/samples/console/Elsa.Samples.GoBackConsole/Program.cs b/src/samples/console/Elsa.Samples.GoBackConsole/Program.cs index 6156bd012..72110c7da 100644 --- a/src/samples/console/Elsa.Samples.GoBackConsole/Program.cs +++ b/src/samples/console/Elsa.Samples.GoBackConsole/Program.cs @@ -1,4 +1,6 @@ -using System.Threading.Tasks; +using System.Threading.Tasks; + +using Elsa.Persistence.InMemory; using Elsa.Samples.GoBackConsole.Activities; using Elsa.Samples.GoBackConsole.Workflows; using Elsa.Services; @@ -16,6 +18,7 @@ namespace Elsa.Samples.GoBackConsole // Create a service container with Elsa services. var services = new ServiceCollection() .AddElsa() + .AddElsaPersistenceInMemory() .AddConsoleActivities() .AddActivity() .AddWorkflow() diff --git a/src/samples/console/Elsa.Samples.HelloWorldConsole/Elsa.Samples.HelloWorldConsole.csproj b/src/samples/console/Elsa.Samples.HelloWorldConsole/Elsa.Samples.HelloWorldConsole.csproj index e4cdfd97b..b22c3b4a1 100644 --- a/src/samples/console/Elsa.Samples.HelloWorldConsole/Elsa.Samples.HelloWorldConsole.csproj +++ b/src/samples/console/Elsa.Samples.HelloWorldConsole/Elsa.Samples.HelloWorldConsole.csproj @@ -12,6 +12,7 @@ + diff --git a/src/samples/console/Elsa.Samples.HelloWorldConsole/Program.cs b/src/samples/console/Elsa.Samples.HelloWorldConsole/Program.cs index 230a4c21f..b82ede3b3 100644 --- a/src/samples/console/Elsa.Samples.HelloWorldConsole/Program.cs +++ b/src/samples/console/Elsa.Samples.HelloWorldConsole/Program.cs @@ -1,5 +1,6 @@ -using System.Threading.Tasks; +using System.Threading.Tasks; using Elsa.Extensions; +using Elsa.Persistence.InMemory; using Elsa.Services; using Microsoft.Extensions.DependencyInjection; @@ -12,6 +13,7 @@ namespace Elsa.Samples.HelloWorldConsole // Create a service container with Elsa services. var services = new ServiceCollection() .AddElsa() + .AddElsaPersistenceInMemory() .AddConsoleActivities() .AddWorkflow() .AddAutoMapperProfiles() diff --git a/src/samples/console/Elsa.Samples.IfElseConsole/Elsa.Samples.IfElseConsole.csproj b/src/samples/console/Elsa.Samples.IfElseConsole/Elsa.Samples.IfElseConsole.csproj index 636f8d393..132d8fd66 100644 --- a/src/samples/console/Elsa.Samples.IfElseConsole/Elsa.Samples.IfElseConsole.csproj +++ b/src/samples/console/Elsa.Samples.IfElseConsole/Elsa.Samples.IfElseConsole.csproj @@ -13,6 +13,7 @@ + diff --git a/src/samples/console/Elsa.Samples.IfElseConsole/Program.cs b/src/samples/console/Elsa.Samples.IfElseConsole/Program.cs index 89134eb59..83f3dcf39 100644 --- a/src/samples/console/Elsa.Samples.IfElseConsole/Program.cs +++ b/src/samples/console/Elsa.Samples.IfElseConsole/Program.cs @@ -1,4 +1,6 @@ -using System.Threading.Tasks; +using System.Threading.Tasks; + +using Elsa.Persistence.InMemory; using Elsa.Services; using Microsoft.Extensions.DependencyInjection; @@ -14,6 +16,7 @@ namespace Elsa.Samples.IfElseConsole // Create a service container with Elsa services. var services = new ServiceCollection() .AddElsa() + .AddElsaPersistenceInMemory() .AddConsoleActivities() .AddWorkflow() .BuildServiceProvider(); diff --git a/src/samples/console/Elsa.Samples.ProgrammaticCompositeActivitiesConsole/Elsa.Samples.ProgrammaticCompositeActivitiesConsole.csproj b/src/samples/console/Elsa.Samples.ProgrammaticCompositeActivitiesConsole/Elsa.Samples.ProgrammaticCompositeActivitiesConsole.csproj index e4cdfd97b..b22c3b4a1 100644 --- a/src/samples/console/Elsa.Samples.ProgrammaticCompositeActivitiesConsole/Elsa.Samples.ProgrammaticCompositeActivitiesConsole.csproj +++ b/src/samples/console/Elsa.Samples.ProgrammaticCompositeActivitiesConsole/Elsa.Samples.ProgrammaticCompositeActivitiesConsole.csproj @@ -12,6 +12,7 @@ + diff --git a/src/samples/console/Elsa.Samples.ProgrammaticCompositeActivitiesConsole/Program.cs b/src/samples/console/Elsa.Samples.ProgrammaticCompositeActivitiesConsole/Program.cs index 4890f1521..89dd1b01a 100644 --- a/src/samples/console/Elsa.Samples.ProgrammaticCompositeActivitiesConsole/Program.cs +++ b/src/samples/console/Elsa.Samples.ProgrammaticCompositeActivitiesConsole/Program.cs @@ -1,4 +1,6 @@ -using System.Threading.Tasks; +using System.Threading.Tasks; + +using Elsa.Persistence.InMemory; using Elsa.Samples.ProgrammaticCompositeActivitiesConsole.Activities; using Elsa.Samples.ProgrammaticCompositeActivitiesConsole.Workflows; using Elsa.Services; @@ -13,6 +15,7 @@ namespace Elsa.Samples.ProgrammaticCompositeActivitiesConsole // Create a service container with Elsa services. var services = new ServiceCollection() .AddElsa() + .AddElsaPersistenceInMemory() .AddConsoleActivities() .AddActivity() .AddWorkflow() diff --git a/src/samples/console/Elsa.Samples.ReadLineEchoConsole/Elsa.Samples.ReadLineEchoConsole.csproj b/src/samples/console/Elsa.Samples.ReadLineEchoConsole/Elsa.Samples.ReadLineEchoConsole.csproj index e4cdfd97b..b22c3b4a1 100644 --- a/src/samples/console/Elsa.Samples.ReadLineEchoConsole/Elsa.Samples.ReadLineEchoConsole.csproj +++ b/src/samples/console/Elsa.Samples.ReadLineEchoConsole/Elsa.Samples.ReadLineEchoConsole.csproj @@ -12,6 +12,7 @@ + diff --git a/src/samples/console/Elsa.Samples.ReadLineEchoConsole/Program.cs b/src/samples/console/Elsa.Samples.ReadLineEchoConsole/Program.cs index 42e42dd7f..85968963c 100644 --- a/src/samples/console/Elsa.Samples.ReadLineEchoConsole/Program.cs +++ b/src/samples/console/Elsa.Samples.ReadLineEchoConsole/Program.cs @@ -1,6 +1,7 @@ -using System.Threading.Tasks; +using System.Threading.Tasks; using Elsa.Activities.Console; using Elsa.Builders; +using Elsa.Persistence.InMemory; using Elsa.Services; using Microsoft.Extensions.DependencyInjection; @@ -13,6 +14,7 @@ namespace Elsa.Samples.ReadLineEchoConsole // Create a service container with Elsa services. var services = new ServiceCollection() .AddElsa() + .AddElsaPersistenceInMemory() .AddConsoleActivities() .BuildServiceProvider(); diff --git a/src/samples/console/Elsa.Samples.Serialization/Elsa.Samples.Serialization.csproj b/src/samples/console/Elsa.Samples.Serialization/Elsa.Samples.Serialization.csproj index 5be34cdbd..60f5f467a 100644 --- a/src/samples/console/Elsa.Samples.Serialization/Elsa.Samples.Serialization.csproj +++ b/src/samples/console/Elsa.Samples.Serialization/Elsa.Samples.Serialization.csproj @@ -12,6 +12,7 @@ + diff --git a/src/samples/console/Elsa.Samples.Serialization/Program.cs b/src/samples/console/Elsa.Samples.Serialization/Program.cs index d57732716..12dd3096a 100644 --- a/src/samples/console/Elsa.Samples.Serialization/Program.cs +++ b/src/samples/console/Elsa.Samples.Serialization/Program.cs @@ -1,7 +1,8 @@ -using System; +using System; using System.Threading.Tasks; using Elsa.Activities.Console; using Elsa.Models; +using Elsa.Persistence.InMemory; using Elsa.Scripting.Liquid.Services; using Elsa.Serialization; using Elsa.Services; @@ -23,6 +24,7 @@ namespace Elsa.Samples.Serialization // Create a service container with Elsa services. var services = new ServiceCollection() .AddElsa() + .AddElsaPersistenceInMemory() .AddConsoleActivities() .BuildServiceProvider(); diff --git a/src/samples/console/Elsa.Samples.SignalingConsole/Elsa.Samples.SignalingConsole.csproj b/src/samples/console/Elsa.Samples.SignalingConsole/Elsa.Samples.SignalingConsole.csproj index e4cdfd97b..b22c3b4a1 100644 --- a/src/samples/console/Elsa.Samples.SignalingConsole/Elsa.Samples.SignalingConsole.csproj +++ b/src/samples/console/Elsa.Samples.SignalingConsole/Elsa.Samples.SignalingConsole.csproj @@ -12,6 +12,7 @@ + diff --git a/src/samples/console/Elsa.Samples.SignalingConsole/Program.cs b/src/samples/console/Elsa.Samples.SignalingConsole/Program.cs index 09e299d72..9a850b848 100644 --- a/src/samples/console/Elsa.Samples.SignalingConsole/Program.cs +++ b/src/samples/console/Elsa.Samples.SignalingConsole/Program.cs @@ -1,6 +1,7 @@ -using System; +using System; using System.Threading.Tasks; using Elsa.Activities.Signaling.Services; +using Elsa.Persistence.InMemory; using Elsa.Services; using Microsoft.Extensions.DependencyInjection; @@ -16,6 +17,7 @@ namespace Elsa.Samples.SignalingConsole // Create a service container with Elsa services. var services = new ServiceCollection() .AddElsa() + .AddElsaPersistenceInMemory() .AddConsoleActivities() .AddWorkflow() .BuildServiceProvider(); diff --git a/src/samples/console/Elsa.Samples.WhileLoopConsole/Elsa.Samples.WhileLoopConsole.csproj b/src/samples/console/Elsa.Samples.WhileLoopConsole/Elsa.Samples.WhileLoopConsole.csproj index e4cdfd97b..b22c3b4a1 100644 --- a/src/samples/console/Elsa.Samples.WhileLoopConsole/Elsa.Samples.WhileLoopConsole.csproj +++ b/src/samples/console/Elsa.Samples.WhileLoopConsole/Elsa.Samples.WhileLoopConsole.csproj @@ -12,6 +12,7 @@ + diff --git a/src/samples/console/Elsa.Samples.WhileLoopConsole/Program.cs b/src/samples/console/Elsa.Samples.WhileLoopConsole/Program.cs index 63efc9ded..f0b4a5b7c 100644 --- a/src/samples/console/Elsa.Samples.WhileLoopConsole/Program.cs +++ b/src/samples/console/Elsa.Samples.WhileLoopConsole/Program.cs @@ -1,4 +1,6 @@ -using System.Threading.Tasks; +using System.Threading.Tasks; + +using Elsa.Persistence.InMemory; using Elsa.Services; using Microsoft.Extensions.DependencyInjection; @@ -14,6 +16,7 @@ namespace Elsa.Samples.WhileLoopConsole // Create a service container with Elsa services. var services = new ServiceCollection() .AddElsa() + .AddElsaPersistenceInMemory() .AddConsoleActivities() .BuildServiceProvider(); diff --git a/src/samples/worker/Elsa.Samples.AzureServiceBusWorker/Elsa.Samples.AzureServiceBusWorker.csproj b/src/samples/worker/Elsa.Samples.AzureServiceBusWorker/Elsa.Samples.AzureServiceBusWorker.csproj index 025d2f1c6..24977887d 100644 --- a/src/samples/worker/Elsa.Samples.AzureServiceBusWorker/Elsa.Samples.AzureServiceBusWorker.csproj +++ b/src/samples/worker/Elsa.Samples.AzureServiceBusWorker/Elsa.Samples.AzureServiceBusWorker.csproj @@ -12,5 +12,6 @@ + diff --git a/src/samples/worker/Elsa.Samples.AzureServiceBusWorker/Program.cs b/src/samples/worker/Elsa.Samples.AzureServiceBusWorker/Program.cs index 5f548a055..c7ab17730 100644 --- a/src/samples/worker/Elsa.Samples.AzureServiceBusWorker/Program.cs +++ b/src/samples/worker/Elsa.Samples.AzureServiceBusWorker/Program.cs @@ -1,4 +1,5 @@ using Elsa.Activities.AzureServiceBus.Extensions; +using Elsa.Persistence.InMemory; using Elsa.Samples.AzureServiceBusWorker.Workflows; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; @@ -19,6 +20,7 @@ namespace Elsa.Samples.AzureServiceBusWorker { services .AddElsa() + .AddElsaPersistenceInMemory() .AddConsoleActivities() .AddTimerActivities() .AddAzureServiceBusActivities(options => options.ConnectionString = hostContext.Configuration.GetConnectionString("AzureServiceBus")) diff --git a/src/samples/worker/Elsa.Samples.CustomAttributesChildWorker/Elsa.Samples.CustomAttributesChildWorker.csproj b/src/samples/worker/Elsa.Samples.CustomAttributesChildWorker/Elsa.Samples.CustomAttributesChildWorker.csproj index dd40ac160..0f6c54a63 100644 --- a/src/samples/worker/Elsa.Samples.CustomAttributesChildWorker/Elsa.Samples.CustomAttributesChildWorker.csproj +++ b/src/samples/worker/Elsa.Samples.CustomAttributesChildWorker/Elsa.Samples.CustomAttributesChildWorker.csproj @@ -13,5 +13,6 @@ + diff --git a/src/samples/worker/Elsa.Samples.CustomAttributesChildWorker/Program.cs b/src/samples/worker/Elsa.Samples.CustomAttributesChildWorker/Program.cs index 45feacada..1fc6d0f69 100644 --- a/src/samples/worker/Elsa.Samples.CustomAttributesChildWorker/Program.cs +++ b/src/samples/worker/Elsa.Samples.CustomAttributesChildWorker/Program.cs @@ -1,3 +1,4 @@ +using Elsa.Persistence.InMemory; using Elsa.Samples.CustomAttributesChildWorker.Messages; using Elsa.Samples.CustomAttributesChildWorker.Workflows; using Microsoft.Extensions.DependencyInjection; @@ -19,6 +20,7 @@ namespace Elsa.Samples.CustomAttributesChildWorker { services .AddElsa() + .AddElsaPersistenceInMemory() .AddTimerActivities() .AddConsoleActivities() .AddRebusActivities() diff --git a/src/samples/worker/Elsa.Samples.DistributedLock/Elsa.Samples.DistributedLock.csproj b/src/samples/worker/Elsa.Samples.DistributedLock/Elsa.Samples.DistributedLock.csproj index 5c4c3a7be..e05411161 100644 --- a/src/samples/worker/Elsa.Samples.DistributedLock/Elsa.Samples.DistributedLock.csproj +++ b/src/samples/worker/Elsa.Samples.DistributedLock/Elsa.Samples.DistributedLock.csproj @@ -16,6 +16,7 @@ + diff --git a/src/samples/worker/Elsa.Samples.DistributedLock/Program.cs b/src/samples/worker/Elsa.Samples.DistributedLock/Program.cs index 948e316ce..1480fe9ca 100644 --- a/src/samples/worker/Elsa.Samples.DistributedLock/Program.cs +++ b/src/samples/worker/Elsa.Samples.DistributedLock/Program.cs @@ -1,7 +1,8 @@ +using Elsa.Persistence.InMemory; + using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using System.Threading.Tasks; -using YesSql.Provider.Sqlite; namespace Elsa.Samples.DistributedLock { @@ -19,9 +20,8 @@ namespace Elsa.Samples.DistributedLock (hostContext, services) => { services - .AddElsa(options => options - .UsePersistence(db => db.UseSqLite("Data Source=elsa.db;Cache=Shared")) - .UseRedisLockProvider("localhost:6379,abortConnect=false")) + .AddElsa(options => options.UseRedisLockProvider("localhost:6379,abortConnect=false")) + .AddElsaPersistenceInMemory() .AddConsoleActivities() .AddTimerActivities() .AddWorkflow(); diff --git a/src/samples/worker/Elsa.Samples.MultiTenantChildWorker/Elsa.Samples.MultiTenantChildWorker.csproj b/src/samples/worker/Elsa.Samples.MultiTenantChildWorker/Elsa.Samples.MultiTenantChildWorker.csproj index 40cc8357e..7292594ea 100644 --- a/src/samples/worker/Elsa.Samples.MultiTenantChildWorker/Elsa.Samples.MultiTenantChildWorker.csproj +++ b/src/samples/worker/Elsa.Samples.MultiTenantChildWorker/Elsa.Samples.MultiTenantChildWorker.csproj @@ -12,5 +12,6 @@ + diff --git a/src/samples/worker/Elsa.Samples.MultiTenantChildWorker/Program.cs b/src/samples/worker/Elsa.Samples.MultiTenantChildWorker/Program.cs index 8d101e9f3..eae4f24a7 100644 --- a/src/samples/worker/Elsa.Samples.MultiTenantChildWorker/Program.cs +++ b/src/samples/worker/Elsa.Samples.MultiTenantChildWorker/Program.cs @@ -1,3 +1,4 @@ +using Elsa.Persistence.InMemory; using Elsa.Samples.MultiTenantChildWorker.Messages; using Elsa.Samples.MultiTenantChildWorker.Workflows; using Microsoft.Extensions.DependencyInjection; @@ -19,6 +20,7 @@ namespace Elsa.Samples.MultiTenantChildWorker { services .AddElsa() + .AddElsaPersistenceInMemory() .AddTimerActivities() .AddConsoleActivities() .AddRebusActivities() diff --git a/src/samples/worker/Elsa.Samples.RebusWorker/Elsa.Samples.RebusWorker.csproj b/src/samples/worker/Elsa.Samples.RebusWorker/Elsa.Samples.RebusWorker.csproj index 48327090e..ec785d4b0 100644 --- a/src/samples/worker/Elsa.Samples.RebusWorker/Elsa.Samples.RebusWorker.csproj +++ b/src/samples/worker/Elsa.Samples.RebusWorker/Elsa.Samples.RebusWorker.csproj @@ -15,5 +15,6 @@ + diff --git a/src/samples/worker/Elsa.Samples.RebusWorker/Program.cs b/src/samples/worker/Elsa.Samples.RebusWorker/Program.cs index d5cf09916..56811f576 100644 --- a/src/samples/worker/Elsa.Samples.RebusWorker/Program.cs +++ b/src/samples/worker/Elsa.Samples.RebusWorker/Program.cs @@ -1,3 +1,4 @@ +using Elsa.Persistence.InMemory; using Elsa.Samples.RebusWorker.Messages; using Elsa.Samples.RebusWorker.Workflows; using Microsoft.Extensions.DependencyInjection; @@ -18,6 +19,7 @@ namespace Elsa.Samples.RebusWorker { services .AddElsa() + .AddElsaPersistenceInMemory() .AddConsoleActivities() .AddTimerActivities() .AddRebusActivities() diff --git a/src/samples/worker/Elsa.Samples.RunChildWorkflowWorker/Elsa.Samples.RunChildWorkflowWorker.csproj b/src/samples/worker/Elsa.Samples.RunChildWorkflowWorker/Elsa.Samples.RunChildWorkflowWorker.csproj index 0c4b09476..d65c9bd1d 100644 --- a/src/samples/worker/Elsa.Samples.RunChildWorkflowWorker/Elsa.Samples.RunChildWorkflowWorker.csproj +++ b/src/samples/worker/Elsa.Samples.RunChildWorkflowWorker/Elsa.Samples.RunChildWorkflowWorker.csproj @@ -11,5 +11,6 @@ + diff --git a/src/samples/worker/Elsa.Samples.RunChildWorkflowWorker/Program.cs b/src/samples/worker/Elsa.Samples.RunChildWorkflowWorker/Program.cs index d59882928..2faaccae8 100644 --- a/src/samples/worker/Elsa.Samples.RunChildWorkflowWorker/Program.cs +++ b/src/samples/worker/Elsa.Samples.RunChildWorkflowWorker/Program.cs @@ -1,3 +1,4 @@ +using Elsa.Persistence.InMemory; using Elsa.Samples.RunChildWorkflowWorker.HostedServices; using Elsa.Samples.RunChildWorkflowWorker.Workflows; using Microsoft.Extensions.DependencyInjection; @@ -19,6 +20,7 @@ namespace Elsa.Samples.RunChildWorkflowWorker { services .AddElsa() + .AddElsaPersistenceInMemory() .AddConsoleActivities() .AddHostedService() .AddWorkflow() diff --git a/src/samples/worker/Elsa.Samples.Timers/Elsa.Samples.Timers.csproj b/src/samples/worker/Elsa.Samples.Timers/Elsa.Samples.Timers.csproj index 8314b3788..f1b6377b0 100644 --- a/src/samples/worker/Elsa.Samples.Timers/Elsa.Samples.Timers.csproj +++ b/src/samples/worker/Elsa.Samples.Timers/Elsa.Samples.Timers.csproj @@ -1,4 +1,4 @@ - + Exe @@ -12,6 +12,7 @@ + diff --git a/src/samples/worker/Elsa.Samples.Timers/Program.cs b/src/samples/worker/Elsa.Samples.Timers/Program.cs index aeb33371b..9e6ccef91 100644 --- a/src/samples/worker/Elsa.Samples.Timers/Program.cs +++ b/src/samples/worker/Elsa.Samples.Timers/Program.cs @@ -1,4 +1,7 @@ using System.Threading.Tasks; + +using Elsa.Persistence.InMemory; + using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using NodaTime; @@ -16,6 +19,7 @@ namespace Elsa.Samples.Timers { services .AddElsa() + .AddElsaPersistenceInMemory() .AddConsoleActivities() .AddTimerActivities() .AddWorkflow() diff --git a/src/samples/worker/Elsa.Samples.WhileLoopWorker/Elsa.Samples.WhileLoopWorker.csproj b/src/samples/worker/Elsa.Samples.WhileLoopWorker/Elsa.Samples.WhileLoopWorker.csproj index 0c4b09476..d65c9bd1d 100644 --- a/src/samples/worker/Elsa.Samples.WhileLoopWorker/Elsa.Samples.WhileLoopWorker.csproj +++ b/src/samples/worker/Elsa.Samples.WhileLoopWorker/Elsa.Samples.WhileLoopWorker.csproj @@ -11,5 +11,6 @@ + diff --git a/src/samples/worker/Elsa.Samples.WhileLoopWorker/Program.cs b/src/samples/worker/Elsa.Samples.WhileLoopWorker/Program.cs index 265f414bc..16ba5275e 100644 --- a/src/samples/worker/Elsa.Samples.WhileLoopWorker/Program.cs +++ b/src/samples/worker/Elsa.Samples.WhileLoopWorker/Program.cs @@ -2,6 +2,7 @@ using Elsa.Samples.WhileLoopWorker.Services; using Elsa.Samples.WhileLoopWorker.Workflows; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; +using Elsa.Persistence.InMemory; namespace Elsa.Samples.WhileLoopWorker { @@ -19,6 +20,7 @@ namespace Elsa.Samples.WhileLoopWorker { services .AddElsa() + .AddElsaPersistenceInMemory() .AddConsoleActivities() .AddTimerActivities() .AddSingleton() diff --git a/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/GetByDefinitionAndVersion.cs b/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/GetByDefinitionAndVersion.cs index 0738474d7..e2b84fbdb 100644 --- a/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/GetByDefinitionAndVersion.cs +++ b/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/GetByDefinitionAndVersion.cs @@ -1,7 +1,8 @@ -using System.Threading; +using System.Threading; using System.Threading.Tasks; using Elsa.Extensions; using Elsa.Models; +using Elsa.Repositories; using Elsa.Serialization; using Elsa.Server.Api.Swagger; using Elsa.Server.Api.Swagger.Examples; @@ -19,12 +20,12 @@ namespace Elsa.Server.Api.Endpoints.WorkflowDefinitions [Produces("application/json")] public class GetByDefinitionAndVersion : Controller { - private readonly IWorkflowDefinitionManager _workflowDefinitionManager; + private readonly IWorkflowDefinitionRepository _workflowDefinitionRepository; private readonly IContentSerializer _serializer; - public GetByDefinitionAndVersion(IWorkflowDefinitionManager workflowDefinitionManager, IContentSerializer serializer) + public GetByDefinitionAndVersion(IWorkflowDefinitionRepository workflowDefinitionRepository, IContentSerializer serializer) { - _workflowDefinitionManager = workflowDefinitionManager; + _workflowDefinitionRepository = workflowDefinitionRepository; _serializer = serializer; } @@ -40,7 +41,7 @@ namespace Elsa.Server.Api.Endpoints.WorkflowDefinitions ] public async Task Handle(string workflowDefinitionId, VersionOptions versionOptions, CancellationToken cancellationToken = default) { - var workflowDefinition = await _workflowDefinitionManager.GetAsync(workflowDefinitionId, versionOptions, cancellationToken); + var workflowDefinition = await _workflowDefinitionRepository.GetAsync(workflowDefinitionId, versionOptions, cancellationToken); return workflowDefinition == null ? (IActionResult) NotFound() : Json(workflowDefinition, _serializer.GetSettings()); } } diff --git a/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/GetByVersionId.cs b/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/GetByVersionId.cs index 20957e9dc..7f8a82868 100644 --- a/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/GetByVersionId.cs +++ b/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/GetByVersionId.cs @@ -1,11 +1,9 @@ -using System.Threading; +using System.Threading; using System.Threading.Tasks; -using Elsa.Extensions; using Elsa.Models; +using Elsa.Repositories; using Elsa.Serialization; -using Elsa.Server.Api.Swagger; using Elsa.Server.Api.Swagger.Examples; -using Elsa.Services; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Swashbuckle.AspNetCore.Annotations; @@ -19,12 +17,12 @@ namespace Elsa.Server.Api.Endpoints.WorkflowDefinitions [Produces("application/json")] public class GetByVersionId : Controller { - private readonly IWorkflowDefinitionManager _workflowDefinitionManager; + private readonly IWorkflowDefinitionRepository _workflowDefinitionRepository; private readonly IContentSerializer _serializer; - public GetByVersionId(IWorkflowDefinitionManager workflowDefinitionManager, IContentSerializer serializer) + public GetByVersionId(IWorkflowDefinitionRepository workflowDefinitionRepository, IContentSerializer serializer) { - _workflowDefinitionManager = workflowDefinitionManager; + _workflowDefinitionRepository = workflowDefinitionRepository; _serializer = serializer; } @@ -40,7 +38,7 @@ namespace Elsa.Server.Api.Endpoints.WorkflowDefinitions ] public async Task Handle(string workflowDefinitionVersionId, CancellationToken cancellationToken = default) { - var workflowDefinition = await _workflowDefinitionManager.GetByVersionIdAsync(workflowDefinitionVersionId, cancellationToken); + var workflowDefinition = await _workflowDefinitionRepository.GetByVersionIdAsync(workflowDefinitionVersionId, cancellationToken); return workflowDefinition == null ? (IActionResult) NotFound() : Json(workflowDefinition, _serializer.GetSettings()); } } diff --git a/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/List.cs b/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/List.cs index 1ae7bf4c0..12cbd9655 100644 --- a/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/List.cs +++ b/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/List.cs @@ -1,12 +1,11 @@ -using System.Linq; +using System.Linq; using System.Threading; using System.Threading.Tasks; using Elsa.Models; +using Elsa.Repositories; using Elsa.Serialization; using Elsa.Server.Api.Models; -using Elsa.Server.Api.Swagger; using Elsa.Server.Api.Swagger.Examples; -using Elsa.Services; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Swashbuckle.AspNetCore.Annotations; @@ -20,12 +19,12 @@ namespace Elsa.Server.Api.Endpoints.WorkflowDefinitions [Produces("application/json")] public class List : Controller { - private readonly IWorkflowDefinitionManager _workflowDefinitionManager; + private readonly IWorkflowDefinitionRepository _workflowDefinitionRepository; private readonly IContentSerializer _serializer; - public List(IWorkflowDefinitionManager workflowDefinitionManager, IContentSerializer serializer) + public List(IWorkflowDefinitionRepository workflowDefinitionRepository, IContentSerializer serializer) { - _workflowDefinitionManager = workflowDefinitionManager; + _workflowDefinitionRepository = workflowDefinitionRepository; _serializer = serializer; } @@ -41,9 +40,9 @@ namespace Elsa.Server.Api.Endpoints.WorkflowDefinitions public async Task>> Handle(int? page = default, int? pageSize = default, VersionOptions? version = default, CancellationToken cancellationToken = default) { version ??= VersionOptions.Latest; - var totalCount = await _workflowDefinitionManager.CountAsync(version, cancellationToken); + var totalCount = await _workflowDefinitionRepository.CountAsync(version, cancellationToken); var skip = page * pageSize; - var items = await _workflowDefinitionManager.ListAsync(skip, pageSize, version, cancellationToken); + var items = await _workflowDefinitionRepository.ListAsync(skip, pageSize, version, cancellationToken); var pagedList = new PagedList(items.ToList(), page, pageSize, totalCount); return Json(pagedList, _serializer.GetSettings()); diff --git a/src/server/Elsa.Server.Api/Endpoints/WorkflowInstances/Get.cs b/src/server/Elsa.Server.Api/Endpoints/WorkflowInstances/Get.cs index 5932ab590..7f69833e7 100644 --- a/src/server/Elsa.Server.Api/Endpoints/WorkflowInstances/Get.cs +++ b/src/server/Elsa.Server.Api/Endpoints/WorkflowInstances/Get.cs @@ -1,16 +1,10 @@ -using System.Threading; +using System.Threading; using System.Threading.Tasks; -using AutoMapper; -using Elsa.Extensions; using Elsa.Models; -using Elsa.Server.Api.Endpoints.WorkflowRegistry; -using Elsa.Server.Api.Models; -using Elsa.Server.Api.Swagger.Examples; -using Elsa.Services; +using Elsa.Repositories; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Swashbuckle.AspNetCore.Annotations; -using Swashbuckle.AspNetCore.Filters; namespace Elsa.Server.Api.Endpoints.WorkflowInstances { @@ -20,11 +14,11 @@ namespace Elsa.Server.Api.Endpoints.WorkflowInstances [Produces("application/json")] public class Get : Controller { - private readonly IWorkflowInstanceManager _workflowInstanceManager; + private readonly IWorkflowInstanceRepository _workflowInstanceManager; - public Get(IWorkflowInstanceManager workflowInstanceManager) + public Get(IWorkflowInstanceRepository workflowInstanceRepository) { - _workflowInstanceManager = workflowInstanceManager; + _workflowInstanceManager = workflowInstanceRepository; } [HttpGet] diff --git a/src/server/Elsa.Server.Api/Endpoints/WorkflowInstances/List.cs b/src/server/Elsa.Server.Api/Endpoints/WorkflowInstances/List.cs index 6d49da876..7ec1a739c 100644 --- a/src/server/Elsa.Server.Api/Endpoints/WorkflowInstances/List.cs +++ b/src/server/Elsa.Server.Api/Endpoints/WorkflowInstances/List.cs @@ -1,9 +1,8 @@ -using System.Threading; +using System.Threading; using System.Threading.Tasks; -using Elsa.Extensions; using Elsa.Models; +using Elsa.Repositories; using Elsa.Server.Api.Models; -using Elsa.Services; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Open.Linq.AsyncExtensions; @@ -17,11 +16,11 @@ namespace Elsa.Server.Api.Endpoints.WorkflowInstances [Produces("application/json")] public class List : Controller { - private readonly IWorkflowInstanceManager _workflowInstanceManager; + private readonly IWorkflowInstanceRepository _workflowInstanceManager; - public List(IWorkflowInstanceManager workflowInstanceManager) + public List(IWorkflowInstanceRepository workflowInstanceRepository) { - _workflowInstanceManager = workflowInstanceManager; + _workflowInstanceManager = workflowInstanceRepository; } [HttpGet] diff --git a/src/server/Elsa.Server.Api/Models/PagedList.cs b/src/server/Elsa.Server.Api/Models/PagedList.cs index c0c217857..c7382988e 100644 --- a/src/server/Elsa.Server.Api/Models/PagedList.cs +++ b/src/server/Elsa.Server.Api/Models/PagedList.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; namespace Elsa.Server.Api.Models { diff --git a/src/server/Elsa.Server.Host/Elsa.Server.Host.csproj b/src/server/Elsa.Server.Host/Elsa.Server.Host.csproj index 5378ea5e9..97db11fc8 100644 --- a/src/server/Elsa.Server.Host/Elsa.Server.Host.csproj +++ b/src/server/Elsa.Server.Host/Elsa.Server.Host.csproj @@ -11,6 +11,7 @@ + diff --git a/src/server/Elsa.Server.Host/Startup.cs b/src/server/Elsa.Server.Host/Startup.cs index cca60dd97..237ec82da 100644 --- a/src/server/Elsa.Server.Host/Startup.cs +++ b/src/server/Elsa.Server.Host/Startup.cs @@ -6,7 +6,9 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; +using Elsa.Persistence.YesSql; using YesSql.Provider.Sqlite; +using System.Data; namespace Elsa.Server.Host { @@ -27,9 +29,8 @@ namespace Elsa.Server.Host var connectionString = Configuration.GetConnectionString("Sqlite"); services - .AddElsa( - elsa => elsa - .UsePersistence(config => config.UseSqLite(connectionString))); + .AddElsa() + .AddElsaPersistenceYesSql((sp, config) => config.UseSqLite(connectionString, IsolationLevel.ReadUncommitted)); services .AddElsaApiEndpoints() diff --git a/test/shared/Elsa.Testing.Shared/Elsa.Testing.Shared.csproj b/test/shared/Elsa.Testing.Shared/Elsa.Testing.Shared.csproj index 868ae0ed7..8d93770d2 100644 --- a/test/shared/Elsa.Testing.Shared/Elsa.Testing.Shared.csproj +++ b/test/shared/Elsa.Testing.Shared/Elsa.Testing.Shared.csproj @@ -35,6 +35,7 @@ + diff --git a/test/shared/Elsa.Testing.Shared/Unit/WorkflowsUnitTestBase.cs b/test/shared/Elsa.Testing.Shared/Unit/WorkflowsUnitTestBase.cs index 814cebcc0..35fe3a67b 100644 --- a/test/shared/Elsa.Testing.Shared/Unit/WorkflowsUnitTestBase.cs +++ b/test/shared/Elsa.Testing.Shared/Unit/WorkflowsUnitTestBase.cs @@ -1,14 +1,13 @@ using System; using System.Threading.Tasks; using Elsa.Builders; +using Elsa.Persistence.InMemory; using Elsa.Services; using Elsa.Testing.Shared.Helpers; using Elsa.Triggers; using Microsoft.Extensions.DependencyInjection; using Xunit; using Xunit.Abstractions; -using YesSql; -using YesSql.Provider.Sqlite; namespace Elsa.Testing.Shared.Unit { @@ -22,7 +21,8 @@ namespace Elsa.Testing.Shared.Unit TestOutputHelper = testOutputHelper; var services = new ServiceCollection() - .AddElsa(options => options.UsePersistence(config => ConfigurePersistence(config, _tempFolder.Folder))) + .AddElsa() + .AddElsaPersistenceInMemory() .AddConsoleActivities(Console.In, new XunitConsoleForwarder(testOutputHelper)); configureServices?.Invoke(services); @@ -56,11 +56,5 @@ namespace Elsa.Testing.Shared.Unit await ServiceProvider.DisposeAsync(); Dispose(); } - - private void ConfigurePersistence(IConfiguration configuration, string folder) - { - var connectionString = $@"Data Source={folder}elsa.db;Cache=Shared"; - configuration.UseSqLite(connectionString).UseDefaultIdGenerator(); - } } } \ No newline at end of file