jbogard / MediatR

Simple, unambitious mediator implementation in .NET
Apache License 2.0
11.03k stars 1.16k forks source link

Changing IRequest to just be a normal Task instead of Task<Unit> #835

Closed jbogard closed 1 year ago

jbogard commented 1 year ago

This includes the following API changes to change IRequest to use Task instead of Task<Unit> to make void handlers easier:

- public interface IRequest : IRequest<Unit> { }
+ public interface IRequest : IBaseRequest { }
- public interface IRequestHandler<in TRequest> : IRequestHandler<TRequest, Unit>
-     where TRequest : IRequest<Unit>
+ public interface IRequestHandler<in TRequest>
+    where TRequest : IRequest {
+     Task Handle(TRequest request, CancellationToken cancellationToken);
+ }
public interface IMediator {
+    Task Send<TRequest>(TRequest request, CancellationToken cancellationToken = default)
+        where TRequest : IRequest;
}

Handlers that implement IRequestHandler<IRequest> need to change their return types to Task from Task<Unit>:

public class VoidRequest : IRequest { }

public class VoidRequestHandler : IRequestHandler<VoidRequest>
{
-    public Task<Unit> Handle(VoidRequest request, CancellationToken cancellationToken)
+    public Task Handle(VoidRequest request, CancellationToken cancellationToken)
    {
-        return Unit.Task;
+        return Task.CompletedTask;
    }
}

Async version:

public class VoidRequest : IRequest { }

public class VoidRequestHandler : IRequestHandler<VoidRequest>
{
-    public async Task<Unit> Handle(VoidRequest request, CancellationToken cancellationToken)
+    public async Task Handle(VoidRequest request, CancellationToken cancellationToken)
    {
          await SomeThing();
-        return Unit.Value;
+        return;
    }
}