Skip to content

Commit

Permalink
More fixes to void/result constraints
Browse files Browse the repository at this point in the history
  • Loading branch information
aritchie committed Jun 17, 2024
1 parent cc22e51 commit 5d57de5
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 25 deletions.
1 change: 1 addition & 0 deletions Sample/Handlers/ErrorRequestHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace Sample.Handlers;


[RegisterHandler]
public class ErrorRequestHandler : IRequestHandler<ErrorRequest>
{
Expand Down
7 changes: 3 additions & 4 deletions Sample/MauiProgram.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,10 @@ public static MauiApp CreateMauiApp()
.UseBlazor()
.AddUserNotificationExceptionMiddleware(new UserExceptionRequestMiddlewareConfig
{
ErrorConfirm = "Error",
ErrorConfirm = "OK",
ErrorTitle = "OOOPS",
ErrorMessage = "You did something wrong",
#if DEBUG
ShowFullException = true
#endif
ShowFullException = false
})
);
builder.Services.AddDiscoveredMediatorHandlersFromSample();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ namespace Shiny.Mediator.Middleware;
public class CacheRequestMiddleware<TRequest, TResult>(
IConnectivity connectivity,
IFileSystem fileSystem
) : IRequestMiddleware<TRequest, TResult> where TRequest : IRequest<TResult>
) : IRequestMiddleware<TRequest, TResult>
// IRequestHandler<FlushAllCacheRequest>,
// IRequestHandler<FlushCacheItemRequest>
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
namespace Shiny.Mediator.Middleware;


public class TimedLoggingRequestMiddleware<TRequest, TResult>(ILogger<TRequest> logger) : IRequestMiddleware<TRequest, TResult> where TRequest : IRequest<TResult>
public class TimedLoggingRequestMiddleware<TRequest, TResult>(ILogger<TRequest> logger) : IRequestMiddleware<TRequest, TResult>
{
public async Task<TResult> Process(TRequest request, RequestHandlerDelegate<TResult> next, IRequestHandler requestHandler, CancellationToken cancellationToken)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
namespace Shiny.Mediator.Middleware;


public class UserExceptionRequestMiddleware<TRequest, TResult>(ILogger<TRequest> logger, UserExceptionRequestMiddlewareConfig config) : IRequestMiddleware<TRequest, TResult> where TRequest : IRequest<TResult>
public class UserExceptionRequestMiddleware<TRequest, TResult>(ILogger<TRequest> logger, UserExceptionRequestMiddlewareConfig config) : IRequestMiddleware<TRequest, TResult>
{
public async Task<TResult> Process(TRequest request, RequestHandlerDelegate<TResult> next, IRequestHandler requestHandler, CancellationToken cancellationToken)
{
Expand Down
45 changes: 27 additions & 18 deletions src/Shiny.Mediator/Impl/DefaultRequestSender.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,25 +40,14 @@ public async Task Handle(IServiceProvider services, TRequest request, Cancellati
if (requestHandler == null)
throw new InvalidOperationException("No request handler found for " + request.GetType().FullName);

var handler = new RequestHandlerDelegate<Unit>(async () =>
var handlerExec = new RequestHandlerDelegate<Unit>(async () =>
{
await requestHandler.Handle(request, cancellationToken).ConfigureAwait(false);
return Unit.Value;
});

await services
.GetServices<IRequestMiddleware<TRequest, Unit>>()
.Reverse()
.Aggregate(
handler,
(next, middleware) => () => middleware.Process(
request,
next,
requestHandler,
cancellationToken
)
)
.Invoke()
await RequestExecutor
.Execute(services, request, requestHandler, handlerExec, cancellationToken)
.ConfigureAwait(false);
}
}
Expand All @@ -71,14 +60,34 @@ public async Task<TResult> Handle(IServiceProvider services, TRequest request, C
if (requestHandler == null)
throw new InvalidOperationException("No request handler found for " + request.GetType().FullName);

var handler = new RequestHandlerDelegate<TResult>(()
var handlerExec = new RequestHandlerDelegate<TResult>(()
=> requestHandler.Handle(request, cancellationToken));

var result = await RequestExecutor
.Execute(services, request, requestHandler, handlerExec, cancellationToken)
.ConfigureAwait(false);

return result;
}
}


static class RequestExecutor
{
public static async Task<TResult> Execute<TRequest, TResult>(
IServiceProvider services,
TRequest request,
IRequestHandler requestHandler,
RequestHandlerDelegate<TResult> handlerExec,
CancellationToken cancellationToken
)
{
var middleware = services.GetServices<IRequestMiddleware<TRequest, TResult>>();

var result = await services
.GetServices<IRequestMiddleware<TRequest, TResult>>()
var result = await middleware
.Reverse()
.Aggregate(
handler,
handlerExec,
(next, middleware) => () => middleware.Process(
request,
next,
Expand Down

0 comments on commit 5d57de5

Please sign in to comment.