From fcbb47aa84aa9eb79cae108d27a04bfc2f20c311 Mon Sep 17 00:00:00 2001 From: muelr Date: Thu, 4 May 2023 16:47:58 +0200 Subject: [PATCH] added a type resolver to be replaced by another implementation later. --- src/WorkflowCore.DSL/Interface/ITypeResolver.cs | 10 ++++++++++ .../ServiceCollectionExtensions.cs | 1 + src/WorkflowCore.DSL/Services/DefinitionLoader.cs | 15 +++++++++------ src/WorkflowCore.DSL/Services/TypeResolver.cs | 15 +++++++++++++++ .../DefinitionStorage/DefinitionLoaderTests.cs | 2 +- 5 files changed, 36 insertions(+), 7 deletions(-) create mode 100644 src/WorkflowCore.DSL/Interface/ITypeResolver.cs create mode 100644 src/WorkflowCore.DSL/Services/TypeResolver.cs diff --git a/src/WorkflowCore.DSL/Interface/ITypeResolver.cs b/src/WorkflowCore.DSL/Interface/ITypeResolver.cs new file mode 100644 index 000000000..e9e54e49b --- /dev/null +++ b/src/WorkflowCore.DSL/Interface/ITypeResolver.cs @@ -0,0 +1,10 @@ +using System; +using System.Linq; + +namespace WorkflowCore.Interface +{ + public interface ITypeResolver + { + Type FindType(string name); + } +} \ No newline at end of file diff --git a/src/WorkflowCore.DSL/ServiceCollectionExtensions.cs b/src/WorkflowCore.DSL/ServiceCollectionExtensions.cs index 5c4944f4f..a4958e6b4 100644 --- a/src/WorkflowCore.DSL/ServiceCollectionExtensions.cs +++ b/src/WorkflowCore.DSL/ServiceCollectionExtensions.cs @@ -9,6 +9,7 @@ public static class ServiceCollectionExtensions { public static IServiceCollection AddWorkflowDSL(this IServiceCollection services) { + services.AddTransient(); services.AddTransient(); return services; } diff --git a/src/WorkflowCore.DSL/Services/DefinitionLoader.cs b/src/WorkflowCore.DSL/Services/DefinitionLoader.cs index ef7fadc9a..c5cc5e083 100644 --- a/src/WorkflowCore.DSL/Services/DefinitionLoader.cs +++ b/src/WorkflowCore.DSL/Services/DefinitionLoader.cs @@ -17,10 +17,12 @@ namespace WorkflowCore.Services.DefinitionStorage public class DefinitionLoader : IDefinitionLoader { private readonly IWorkflowRegistry _registry; + private readonly ITypeResolver _typeResolver; - public DefinitionLoader(IWorkflowRegistry registry) + public DefinitionLoader(IWorkflowRegistry registry, ITypeResolver typeResolver) { _registry = registry; + _typeResolver = typeResolver; } public WorkflowDefinition LoadDefinition(string source, Func deserializer) @@ -220,10 +222,11 @@ private void AttachOutputs(StepSourceV1 source, Type dataType, Type stepType, Wo var dataParameter = Expression.Parameter(dataType, "data"); - if(output.Key.Contains(".") || output.Key.Contains("[")) + if (output.Key.Contains(".") || output.Key.Contains("[")) { AttachNestedOutput(output, step, source, sourceExpr, dataParameter); - }else + } + else { AttachDirectlyOutput(output, step, dataType, sourceExpr, dataParameter); } @@ -259,11 +262,11 @@ private void AttachDirectlyOutput(KeyValuePair output, WorkflowS } - private void AttachNestedOutput( KeyValuePair output, WorkflowStep step, StepSourceV1 source, LambdaExpression sourceExpr, ParameterExpression dataParameter) + private void AttachNestedOutput(KeyValuePair output, WorkflowStep step, StepSourceV1 source, LambdaExpression sourceExpr, ParameterExpression dataParameter) { PropertyInfo propertyInfo = null; String[] paths = output.Key.Split('.'); - + Expression targetProperty = dataParameter; bool hasAddOutput = false; @@ -352,7 +355,7 @@ private void AttachOutcomes(StepSourceV1 source, Type dataType, WorkflowStep ste private Type FindType(string name) { - return Type.GetType(name, true, true); + return _typeResolver.FindType(name); } private static Action BuildScalarInputAction(KeyValuePair input, ParameterExpression dataParameter, ParameterExpression contextParameter, ParameterExpression environmentVarsParameter, PropertyInfo stepProperty) diff --git a/src/WorkflowCore.DSL/Services/TypeResolver.cs b/src/WorkflowCore.DSL/Services/TypeResolver.cs new file mode 100644 index 000000000..992d38948 --- /dev/null +++ b/src/WorkflowCore.DSL/Services/TypeResolver.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Text; +using WorkflowCore.Interface; + +namespace WorkflowCore.Services.DefinitionStorage +{ + public class TypeResolver : ITypeResolver + { + public Type FindType(string name) + { + return Type.GetType(name, true, true); + } + } +} diff --git a/test/WorkflowCore.UnitTests/Services/DefinitionStorage/DefinitionLoaderTests.cs b/test/WorkflowCore.UnitTests/Services/DefinitionStorage/DefinitionLoaderTests.cs index 01a743e8a..c47ba054b 100644 --- a/test/WorkflowCore.UnitTests/Services/DefinitionStorage/DefinitionLoaderTests.cs +++ b/test/WorkflowCore.UnitTests/Services/DefinitionStorage/DefinitionLoaderTests.cs @@ -19,7 +19,7 @@ public class DefinitionLoaderTests public DefinitionLoaderTests() { _registry = A.Fake(); - _subject = new DefinitionLoader(_registry); + _subject = new DefinitionLoader(_registry, new TypeResolver()); } [Fact(DisplayName = "Should register workflow")]