Skip to content

Commit 48ba706

Browse files
committed
2 parents e885122 + 2d07b54 commit 48ba706

File tree

2 files changed

+43
-3
lines changed

2 files changed

+43
-3
lines changed

src/Foundatio.Mediator/HandlerAnalyzer.cs

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -194,11 +194,15 @@ private static IEnumerable<IMethodSymbol> GetMethods(INamedTypeSymbol targetSymb
194194
var methodSymbols = currentSymbol
195195
.GetMembers()
196196
.Where(m => m.Kind == SymbolKind.Method)
197-
.OfType<IMethodSymbol>()
198-
.Where(p => !methods.ContainsKey(p.Name));
197+
.OfType<IMethodSymbol>();
199198

200199
foreach (var methodSymbol in methodSymbols)
201-
methods.Add(methodSymbol.Name, methodSymbol);
200+
{
201+
var signature = BuildMethodSignature(methodSymbol);
202+
203+
if (!methods.ContainsKey(signature))
204+
methods.Add(signature, methodSymbol);
205+
}
202206

203207
if (!includeBaseMethods)
204208
break;
@@ -209,6 +213,18 @@ private static IEnumerable<IMethodSymbol> GetMethods(INamedTypeSymbol targetSymb
209213
return methods.Values;
210214
}
211215

216+
private static string BuildMethodSignature(IMethodSymbol method)
217+
{
218+
if (method.Parameters.Length == 0)
219+
return method.Name + "()";
220+
221+
var parts = new string[method.Parameters.Length];
222+
for (int i = 0; i < method.Parameters.Length; i++)
223+
parts[i] = method.Parameters[i].Type.ToDisplayString();
224+
225+
return method.Name + "(" + string.Join(",", parts) + ")";
226+
}
227+
212228
private static readonly string[] ValidHandlerMethodNames = [
213229
"Handle", "HandleAsync",
214230
"Handles", "HandlesAsync",

tests/Foundatio.Mediator.Tests/DIRegistrationTests.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,30 @@ public class AHandler { public Task HandleAsync(A m, CancellationToken ct) => Ta
5454
Assert.DoesNotContain("AddTransient<AHandler>()", di.Source);
5555
}
5656

57+
[Fact]
58+
public void Handles_MultipleMessages()
59+
{
60+
var src = """
61+
using System.Threading;
62+
using System.Threading.Tasks;
63+
using Foundatio.Mediator;
64+
65+
public record A;
66+
public record B;
67+
public class MultiHandler {
68+
public Task HandleAsync(A m, CancellationToken ct) => Task.CompletedTask;
69+
public Task HandleAsync(B m, CancellationToken ct) => Task.CompletedTask;
70+
}
71+
""";
72+
73+
var (_, _, trees) = RunGenerator(src, [ new MediatorGenerator() ]);
74+
var di = trees.First(t => t.HintName.EndsWith("_MediatorHandlers.g.cs"));
75+
Assert.Contains("MessageTypeKey.Get(typeof(A))", di.Source);
76+
Assert.Contains("MessageTypeKey.Get(typeof(B))", di.Source);
77+
Assert.Contains("MultiHandler_A_Handler", di.Source);
78+
Assert.Contains("MultiHandler_B_Handler", di.Source);
79+
}
80+
5781
[Theory]
5882
[InlineData("Transient", "AddTransient<AHandler>()")]
5983
[InlineData("Scoped", "AddScoped<AHandler>()")]

0 commit comments

Comments
 (0)