diff --git a/src/DIT.Workflower.DependencyInjection/Common.cs b/src/DIT.Workflower.DependencyInjection/Common.cs new file mode 100644 index 0000000..d2235ac --- /dev/null +++ b/src/DIT.Workflower.DependencyInjection/Common.cs @@ -0,0 +1,3 @@ +namespace DIT.Workflower.DependencyInjection; + +public record DIContextWrapper(TContext Context, IServiceProvider ServiceProvider); diff --git a/src/DIT.Workflower.DependencyInjection/Extensions/IServiceCollectionExtensions.cs b/src/DIT.Workflower.DependencyInjection/Extensions/IServiceCollectionExtensions.cs index 285ba74..269b7c7 100644 --- a/src/DIT.Workflower.DependencyInjection/Extensions/IServiceCollectionExtensions.cs +++ b/src/DIT.Workflower.DependencyInjection/Extensions/IServiceCollectionExtensions.cs @@ -5,7 +5,7 @@ namespace DIT.Workflower.DependencyInjection.Extensions; public static class IServiceCollectionExtensions { - public static ITransitionStart AddWorkflowDefinition(this IServiceCollection services, in int version = 1) + public static ITransitionStart> AddWorkflowDefinition(this IServiceCollection services, in int version = 1) where TState : struct where TCommand : struct { @@ -13,25 +13,25 @@ public static class IServiceCollectionExtensions return AddWorkflowDefinition(services, id, version); } - public static ITransitionStart AddWorkflowDefinition(this IServiceCollection services, in string id) + public static ITransitionStart> AddWorkflowDefinition(this IServiceCollection services, in string id) where TState : struct where TCommand : struct { return AddWorkflowDefinition(services, id, version: 1); } - public static ITransitionStart AddWorkflowDefinition(this IServiceCollection services, string id, int version) + public static ITransitionStart> AddWorkflowDefinition(this IServiceCollection services, string id, int version) where TState : struct where TCommand : struct { - var builder = WorkflowDefinitionBuilder.Create(); + var builder = WorkflowDefinitionBuilder>.Create(); - services.TryAddSingleton, DefaultWorkflowFactory>(); + services.TryAddSingleton>, DefaultWorkflowFactory>>(); - services.AddSingleton, WorkflowDefinitionWrapper>(sp => + services.AddSingleton>, WorkflowDefinitionWrapper>>(sp => { - var definition = (WorkflowDefinitionBuilder)builder; - var wrapper = new WorkflowDefinitionWrapper(definition, id, version); + var definition = (WorkflowDefinitionBuilder>)builder; + var wrapper = new WorkflowDefinitionWrapper>(definition, id, version); return wrapper; }); diff --git a/src/DIT.Workflower.DependencyInjection/Extensions/IServiceProviderExtensions.cs b/src/DIT.Workflower.DependencyInjection/Extensions/IServiceProviderExtensions.cs new file mode 100644 index 0000000..a094cf3 --- /dev/null +++ b/src/DIT.Workflower.DependencyInjection/Extensions/IServiceProviderExtensions.cs @@ -0,0 +1,35 @@ +namespace DIT.Workflower.DependencyInjection.Extensions; + +public static class IServiceProviderExtensions +{ + public static IWorkflowFactory> GetRequiredWorkflowFactory(this IServiceProvider sp) + where TState : struct + where TCommand : struct + { + return sp.GetRequiredService>>(); + } + + public static IWorkflowFactory>? GetWorkflowFactory(this IServiceProvider sp) + where TState : struct + where TCommand : struct + { + return sp.GetService>>(); + } + + public static IWorkflow> CreateWorkflow(this IServiceProvider sp, int version = 1) + where TState : struct + where TCommand : struct + { + var factory = GetRequiredWorkflowFactory(sp); + return factory.CreateWorkflow(version); + } + + public static IWorkflow> CreateWorkflow(this IServiceProvider sp, string id, int version = 1) + where TState : struct + where TCommand : struct + { + var factory = GetRequiredWorkflowFactory(sp); + return factory.CreateWorkflow(id, version); + } + +} diff --git a/src/DIT.Workflower.DependencyInjection/WorkflowDefinitionWrapper.cs b/src/DIT.Workflower.DependencyInjection/WorkflowDefinitionWrapper.cs index 2c70d6d..571d512 100644 --- a/src/DIT.Workflower.DependencyInjection/WorkflowDefinitionWrapper.cs +++ b/src/DIT.Workflower.DependencyInjection/WorkflowDefinitionWrapper.cs @@ -18,7 +18,13 @@ public record WorkflowDefinitionWrapper : WorkflowDe public static string GetDefaultId() { - return $"{typeof(TState).Name}_{typeof(TCommand).Name}_{typeof(TContext).Name}"; + var ctxType = typeof(TContext); + var ctxName = ctxType.Name; + + if (ctxType.IsGenericType) + ctxName = string.Join("+", typeof(TContext).GetGenericArguments().Select(x => x.Name)); + + return $"{typeof(TState).Name}_{typeof(TCommand).Name}_{ctxName}"; } } diff --git a/tests/DIT.Workflower.Tests/DependencyInjection/DependencyInjectionTests.cs b/tests/DIT.Workflower.Tests/DependencyInjection/DependencyInjectionTests.cs index f06cd4b..1b1be3e 100644 --- a/tests/DIT.Workflower.Tests/DependencyInjection/DependencyInjectionTests.cs +++ b/tests/DIT.Workflower.Tests/DependencyInjection/DependencyInjectionTests.cs @@ -40,8 +40,7 @@ public class DependencyInjectionTests var sp = sc.BuildServiceProvider(); - var workflowFactory = sp.GetRequiredService>(); - + var workflowFactory = sp.GetRequiredWorkflowFactory(); var v1 = workflowFactory.CreateWorkflow(id); var v2 = workflowFactory.CreateWorkflow(id, version: 2); @@ -62,6 +61,7 @@ public class DependencyInjectionTests public void IdGenerationTest() { var sc = new ServiceCollection(); + const string expectedId = "PhoneState_PhoneCommand_PhoneCall"; sc.AddWorkflowDefinition(version: 1) .From(PhoneState.Idle) @@ -69,10 +69,12 @@ public class DependencyInjectionTests .To(PhoneState.Ringing); var sp = sc.BuildServiceProvider(); - var workflowFactory = sp.GetRequiredService>(); + var workflowFactory = sp.GetRequiredWorkflowFactory(); var workflow = workflowFactory.CreateWorkflow(); - Assert.Equal("PhoneState_PhoneCommand_PhoneCall", workflow.Id); + Assert.Equal(expectedId, workflow.Id); + Assert.Equal(expectedId, sp.CreateWorkflow().Id); + Assert.Equal(expectedId, sp.CreateWorkflow(expectedId).Id); } [Fact] @@ -86,7 +88,7 @@ public class DependencyInjectionTests .To(PhoneState.Ringing); var sp = sc.BuildServiceProvider(); - var workflowFactory = sp.GetRequiredService>(); + var workflowFactory = sp.GetRequiredWorkflowFactory(); Assert.Throws(() => workflowFactory.CreateWorkflow("unknown")); }