diff --git a/src/common/Elsa.Mediator/Contracts/IRequestSender.cs b/src/common/Elsa.Mediator/Contracts/IRequestSender.cs
index 37d4288f9..de23cd440 100644
--- a/src/common/Elsa.Mediator/Contracts/IRequestSender.cs
+++ b/src/common/Elsa.Mediator/Contracts/IRequestSender.cs
@@ -12,5 +12,5 @@ public interface IRequestSender
/// The cancellation token.
/// The type of the response.
/// The response.
- Task> SendAsync(IRequest request, CancellationToken cancellationToken = default);
+ Task SendAsync(IRequest request, CancellationToken cancellationToken = default);
}
\ No newline at end of file
diff --git a/src/common/Elsa.Mediator/Middleware/Request/Components/RequestHandlerInvokerMiddleware.cs b/src/common/Elsa.Mediator/Middleware/Request/Components/RequestHandlerInvokerMiddleware.cs
index 930d324f9..2055515f1 100644
--- a/src/common/Elsa.Mediator/Middleware/Request/Components/RequestHandlerInvokerMiddleware.cs
+++ b/src/common/Elsa.Mediator/Middleware/Request/Components/RequestHandlerInvokerMiddleware.cs
@@ -6,24 +6,10 @@ namespace Elsa.Mediator.Middleware.Request.Components;
///
/// A middleware component that invokes request handlers.
///
-public class RequestHandlerInvokerMiddleware : IRequestMiddleware
+public class RequestHandlerInvokerMiddleware(
+ RequestMiddlewareDelegate next,
+ IEnumerable requestHandlers) : IRequestMiddleware
{
- private readonly RequestMiddlewareDelegate _next;
- private readonly IEnumerable _requestHandlers;
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The next middleware in the pipeline.
- ///
- public RequestHandlerInvokerMiddleware(
- RequestMiddlewareDelegate next,
- IEnumerable requestHandlers)
- {
- _next = next;
- _requestHandlers = requestHandlers;
- }
-
///
public async ValueTask InvokeAsync(RequestContext context)
{
@@ -33,22 +19,26 @@ public class RequestHandlerInvokerMiddleware : IRequestMiddleware
var requestType = request.GetType();
var responseType = context.ResponseType;
var handlerType = typeof(IRequestHandler<,>).MakeGenericType(requestType, responseType);
- var handlers = _requestHandlers.Where(x => handlerType.IsInstanceOfType(x)).ToArray();
+ var handlers = requestHandlers.Where(x => handlerType.IsInstanceOfType(x)).ToArray();
+
+ if (handlers.Length == 0)
+ throw new InvalidOperationException($"There is no handler to handle the {requestType.FullName} request");
- foreach (var handler in handlers)
- {
- var handleMethod = handlerType.GetMethod("HandleAsync")!;
- var cancellationToken = context.CancellationToken;
- var task = (Task)handleMethod.Invoke(handler, new object?[] { request, cancellationToken })!;
- await task;
+ if (handlers.Length > 1)
+ throw new InvalidOperationException($"Multiple handlers were found to handle the {requestType.FullName} request");
- // Get result of task.
- var taskWithReturnType = typeof(Task<>).MakeGenericType(responseType);
- var resultProperty = taskWithReturnType.GetProperty(nameof(Task