diff --git a/README.md b/README.md index 0cac1ca..e0356f8 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,6 @@ Install the latest nuget package into your ASP.NET Core application. ``` ### Workflow Builder -In the `Program.cs`, register the Swagger generator, defining one or more Swagger documents. ```csharp using DIT.Workflower; @@ -50,11 +49,13 @@ var allowedTransitions = workflow.GetAllowedTransitions(from: TState.State_2); ### Dependency Injection +In the `Program.cs`, register the workflow factory, defining one or more workflow definitions. + ```csharp public record PhoneCall(bool Active); -services.AddWorkflowDefinition(version: 1) +services.AddWorkflowDefinition(id: "constant-id", version: 1) // Idle -> Ringing (Incoming) .From(PhoneState.Idle) .On(PhoneCommand.IncomingCall) @@ -80,7 +81,7 @@ public class SampleController : JsonApiControllerBase public SampleController(IWorkflowFactory factory) { - _workflow = factory.CreateWorkflow(version: 1); // Optional version param to support versioning on workflows. + _workflow = factory.CreateWorkflow(id: "constant-id", version: 1); // Optional version param to support versioning on workflows. } [HttpGet("{state}")] @@ -93,3 +94,8 @@ public class SampleController : JsonApiControllerBase } } ``` + +Note: If you do not specify an id for the workflow, the default id is: +```csharp +$"{typeof(TState).Name}_{typeof(TCommand).Name}_{typeof(TContext).Name}"; +``` diff --git a/src/DIT.Workflower.DependencyInjection/Abstractions/IWorkflowFactory.cs b/src/DIT.Workflower.DependencyInjection/Abstractions/IWorkflowFactory.cs index 8503f29..c66393b 100644 --- a/src/DIT.Workflower.DependencyInjection/Abstractions/IWorkflowFactory.cs +++ b/src/DIT.Workflower.DependencyInjection/Abstractions/IWorkflowFactory.cs @@ -4,9 +4,8 @@ public interface IWorkflowFactory where TState : struct where TCommand : struct { + public IWorkflow CreateWorkflow(int version = 1); - public IWorkflow CreateWorkflow(string id); - - public IWorkflow CreateWorkflow(string id, int version); + public IWorkflow CreateWorkflow(string id, int version = 1); } diff --git a/src/DIT.Workflower.DependencyInjection/DefaultWorkflowFactory.cs b/src/DIT.Workflower.DependencyInjection/DefaultWorkflowFactory.cs index dfe6012..65a338c 100644 --- a/src/DIT.Workflower.DependencyInjection/DefaultWorkflowFactory.cs +++ b/src/DIT.Workflower.DependencyInjection/DefaultWorkflowFactory.cs @@ -12,10 +12,13 @@ public class DefaultWorkflowFactory : IWorkflowFacto _serviceProvider = sp; } - public IWorkflow CreateWorkflow(string id) - => CreateWorkflow(id, version: 1); + public IWorkflow CreateWorkflow(int version = 1) + { + var id = WorkflowDefinitionWrapper.GetDefaultId(); + return CreateWorkflow(id, version); + } - public IWorkflow CreateWorkflow(string id, int version) + public IWorkflow CreateWorkflow(string id, int version = 1) { var reference = $"{id}.v{version}"; var service = _serviceProvider.GetServices>() diff --git a/src/DIT.Workflower.DependencyInjection/Extensions/IServiceCollectionExtensions.cs b/src/DIT.Workflower.DependencyInjection/Extensions/IServiceCollectionExtensions.cs index 42bced4..285ba74 100644 --- a/src/DIT.Workflower.DependencyInjection/Extensions/IServiceCollectionExtensions.cs +++ b/src/DIT.Workflower.DependencyInjection/Extensions/IServiceCollectionExtensions.cs @@ -5,7 +5,15 @@ namespace DIT.Workflower.DependencyInjection.Extensions; public static class IServiceCollectionExtensions { - public static ITransitionStart AddWorkflowDefinition(this IServiceCollection services, string id) + public static ITransitionStart AddWorkflowDefinition(this IServiceCollection services, in int version = 1) + where TState : struct + where TCommand : struct + { + var id = WorkflowDefinitionWrapper.GetDefaultId(); + return AddWorkflowDefinition(services, id, version); + } + + public static ITransitionStart AddWorkflowDefinition(this IServiceCollection services, in string id) where TState : struct where TCommand : struct { diff --git a/src/DIT.Workflower.DependencyInjection/WorkflowDefinitionWrapper.cs b/src/DIT.Workflower.DependencyInjection/WorkflowDefinitionWrapper.cs index 334fa51..2c70d6d 100644 --- a/src/DIT.Workflower.DependencyInjection/WorkflowDefinitionWrapper.cs +++ b/src/DIT.Workflower.DependencyInjection/WorkflowDefinitionWrapper.cs @@ -16,4 +16,9 @@ public record WorkflowDefinitionWrapper : WorkflowDe Version = version; } + public static string GetDefaultId() + { + return $"{typeof(TState).Name}_{typeof(TCommand).Name}_{typeof(TContext).Name}"; + } + } diff --git a/tests/DIT.Workflower.Tests/DependencyInjection/DependencyInjectionTests.cs b/tests/DIT.Workflower.Tests/DependencyInjection/DependencyInjectionTests.cs index ffc7dc0..b5649c8 100644 --- a/tests/DIT.Workflower.Tests/DependencyInjection/DependencyInjectionTests.cs +++ b/tests/DIT.Workflower.Tests/DependencyInjection/DependencyInjectionTests.cs @@ -40,7 +40,7 @@ public class DependencyInjectionTests var sp = sc.BuildServiceProvider(); - var workflowFactory = sp.GetService>()!; + var workflowFactory = sp.GetRequiredService>(); var v1 = workflowFactory.CreateWorkflow(id); @@ -58,4 +58,21 @@ public class DependencyInjectionTests Assert.Equal(2, v2.GetAllowedTransitions(PhoneState.Ringing).Count); } + [Fact] + public void IdGenerationTest() + { + var sc = new ServiceCollection(); + + sc.AddWorkflowDefinition(version: 1) + .From(PhoneState.Idle) + .On(PhoneCommand.IncomingCall) + .To(PhoneState.Ringing); + + var sp = sc.BuildServiceProvider(); + var workflowFactory = sp.GetRequiredService>(); + var workflow = workflowFactory.CreateWorkflow(); + + Assert.Equal("PhoneState_PhoneCommand_PhoneCall", workflow.Id); + } + }