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;
}