fix(dispatcher): throw on ambiguous handlers instead of silent .First()
Multiple handlers for the same request were previously resolved via .First(), with ordering depending on Type.GetInterfaces() order (non-deterministic). Now ScalarRequestInvoker/StreamRequestInvoker throw InvalidOperationException listing the candidate handlers when more than one matches.
This commit is contained in:
parent
f7263c33a8
commit
f79e8780f7
7 changed files with 134 additions and 9 deletions
|
|
@ -0,0 +1,24 @@
|
|||
// Copyright (c) The Geekeey Authors
|
||||
// SPDX-License-Identifier: EUPL-1.2
|
||||
|
||||
namespace Geekeey.Request.Dispatcher.Tests;
|
||||
|
||||
public sealed class DuplicateScalarRequest : IScalarRequest<string>
|
||||
{
|
||||
}
|
||||
|
||||
public sealed class DuplicateScalarHandlerA : IScalarRequestHandler<DuplicateScalarRequest, string>
|
||||
{
|
||||
public Task<string> HandleAsync(DuplicateScalarRequest request, CancellationToken cancellationToken)
|
||||
{
|
||||
return Task.FromResult("A");
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class DuplicateScalarHandlerB : IScalarRequestHandler<DuplicateScalarRequest, string>
|
||||
{
|
||||
public Task<string> HandleAsync(DuplicateScalarRequest request, CancellationToken cancellationToken)
|
||||
{
|
||||
return Task.FromResult("B");
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
// Copyright (c) The Geekeey Authors
|
||||
// SPDX-License-Identifier: EUPL-1.2
|
||||
|
||||
namespace Geekeey.Request.Dispatcher.Tests;
|
||||
|
||||
public sealed class DuplicateStreamRequest : IStreamRequest<string>
|
||||
{
|
||||
}
|
||||
|
||||
public sealed class DuplicateStreamHandlerA : IStreamRequestHandler<DuplicateStreamRequest, string>
|
||||
{
|
||||
public async IAsyncEnumerable<string> HandleAsync(DuplicateStreamRequest request, [System.Runtime.CompilerServices.EnumeratorCancellation] CancellationToken cancellationToken)
|
||||
{
|
||||
yield return "A";
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class DuplicateStreamHandlerB : IStreamRequestHandler<DuplicateStreamRequest, string>
|
||||
{
|
||||
public async IAsyncEnumerable<string> HandleAsync(DuplicateStreamRequest request, [System.Runtime.CompilerServices.EnumeratorCancellation] CancellationToken cancellationToken)
|
||||
{
|
||||
yield return "B";
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue