diff --git a/src/DotNetCore.CAP/Internal/ConsumerExecutorDescriptor.cs b/src/DotNetCore.CAP/Internal/ConsumerExecutorDescriptor.cs index 7a5cc0a..a9da4ad 100644 --- a/src/DotNetCore.CAP/Internal/ConsumerExecutorDescriptor.cs +++ b/src/DotNetCore.CAP/Internal/ConsumerExecutorDescriptor.cs @@ -28,8 +28,8 @@ namespace DotNetCore.CAP.Internal /// /// Topic name based on both and . /// - public string TopicName - { + public string TopicName + { get { if (_topicName == null) @@ -44,11 +44,48 @@ namespace DotNetCore.CAP.Internal _topicName = Attribute.Name; } } - return _topicName; + return _topicName; } } } + public class ConsumerExecutorDescriptorComparer : IEqualityComparer + { + public bool Equals(ConsumerExecutorDescriptor x, ConsumerExecutorDescriptor y) + { + //Check whether the compared objects reference the same data. + if (ReferenceEquals(x, y)) + { + return true; + } + + //Check whether any of the compared objects is null. + if (x is null || y is null) + { + return false; + } + + //Check whether the ConsumerExecutorDescriptor' properties are equal. + return x.TopicName.Equals(y.TopicName, StringComparison.OrdinalIgnoreCase) && + x.Attribute.Group.Equals(y.Attribute.Group, StringComparison.OrdinalIgnoreCase); + } + + public int GetHashCode(ConsumerExecutorDescriptor obj) + { + //Check whether the object is null + if (obj is null) return 0; + + //Get hash code for the Attribute Group field if it is not null. + int hashAttributeGroup = obj.Attribute?.Group == null ? 0 : obj.Attribute.Group.GetHashCode(); + + //Get hash code for the TopicName field. + int hashTopicName = obj.TopicName.GetHashCode(); + + //Calculate the hash code. + return hashAttributeGroup ^ hashTopicName; + } + } + public class ParameterDescriptor { public string Name { get; set; } diff --git a/src/DotNetCore.CAP/Internal/IConsumerServiceSelector.Default.cs b/src/DotNetCore.CAP/Internal/IConsumerServiceSelector.Default.cs index 26e0802..0498941 100644 --- a/src/DotNetCore.CAP/Internal/IConsumerServiceSelector.Default.cs +++ b/src/DotNetCore.CAP/Internal/IConsumerServiceSelector.Default.cs @@ -47,6 +47,8 @@ namespace DotNetCore.CAP.Internal executorDescriptorList.AddRange(FindConsumersFromControllerTypes()); + executorDescriptorList = executorDescriptorList.Distinct(new ConsumerExecutorDescriptorComparer()).ToList(); + return executorDescriptorList; }