diff --git a/src/modules/Elsa.Workflows.Core/Services/ActivityRegistry.cs b/src/modules/Elsa.Workflows.Core/Services/ActivityRegistry.cs index 549b178f1..5e7f72c90 100644 --- a/src/modules/Elsa.Workflows.Core/Services/ActivityRegistry.cs +++ b/src/modules/Elsa.Workflows.Core/Services/ActivityRegistry.cs @@ -1,6 +1,7 @@ using Elsa.Workflows.Core.Contracts; using Elsa.Workflows.Core.Helpers; using Elsa.Workflows.Core.Models; +using Microsoft.Extensions.Logging; namespace Elsa.Workflows.Core.Services; @@ -9,6 +10,7 @@ public class ActivityRegistry : IActivityRegistry { private readonly IActivityDescriber _activityDescriber; private readonly IEnumerable _modifiers; + private readonly ILogger _logger; private readonly ISet _manualActivityDescriptors = new HashSet(); private readonly IDictionary> _providedActivityDescriptors = new Dictionary>(); private readonly IDictionary<(string Type, int Version), ActivityDescriptor> _activityDescriptors = new Dictionary<(string Type, int Version), ActivityDescriptor>(); @@ -16,10 +18,11 @@ public class ActivityRegistry : IActivityRegistry /// /// Initializes a new instance of the class. /// - public ActivityRegistry(IActivityDescriber activityDescriber, IEnumerable modifiers) + public ActivityRegistry(IActivityDescriber activityDescriber, IEnumerable modifiers, ILogger logger) { _activityDescriber = activityDescriber; _modifiers = modifiers; + _logger = logger; } /// @@ -98,10 +101,20 @@ public class ActivityRegistry : IActivityRegistry private void Add(ActivityDescriptor descriptor, ICollection target) { - foreach (var modifier in _modifiers) + foreach (var modifier in _modifiers) modifier.Modify(descriptor); - - _activityDescriptors.Add((descriptor.TypeName, descriptor.Version), descriptor); + + // If the descriptor already exists, replace it. But log a warning. + if (_activityDescriptors.TryGetValue((descriptor.TypeName, descriptor.Version), out var existingDescriptor)) + { + // Remove the existing descriptor from the target collection. + target.Remove(existingDescriptor); + + // Log a warning. + _logger.LogWarning("Activity descriptor {ActivityType} v{ActivityVersion} was already registered. Replacing with new descriptor", descriptor.TypeName, descriptor.Version); + } + + _activityDescriptors[(descriptor.TypeName, descriptor.Version)] = descriptor; target.Add(descriptor); }