Validation features for Sidio.Mediator.
$ dotnet add package Sidio.Mediator.ValidationA simple implementation of the mediator pattern in .NET.
// Define a request and request handler
public class MyRequest : IRequest<string>
{
public string Name { get; init; }
}
public class MyRequestHandler : IRequestHandler<MyRequest, string>
{
public Task<Result<string>> HandleAsync(MyRequest request, CancellationToken cancellationToken = default)
{
var result = Result<string>.Success($"Hello {request.Name}");
// Or: Result<string>.Failure("error code", "error message");
return Task.FromResult(result);
}
}
// Provide an arbitrary type to register all request handlers in the assembly of the type:
services.AddMediatorRequestHandlers(typeof(MyRequest));
// Get the request handler from the service provider
var requestHander = serviceProvider.GetRequiredService<IRequestHandler<MyRequest, string>>();
var result = await requestHander.HandleAsync(new MyRequest { Name = "World" });
// or use dependency injection
public class MyClass
{
public MyClass(IRequestHandler<MyRequest, string> requestHandler)
{
}
}// Define a request and request handler
public class MyHttpRequest : IHttpRequest<string>
{
public string Name { get; init; }
}
public class MyHttpRequestHandler : IHttpRequestHandler<MyRequest, string>
{
public Task<HttpResult<string>> HandleAsync(MyRequest request, CancellationToken cancellationToken = default)
{
var result = HttpResult<string>.Ok($"Hello {request.Name}");
// Or for example: HttpResult<string>.Unauthorized();
return Task.FromResult(result);
}
}Request validation uses FluentValidation.
// Define a validator
public class MyRequestValidator : AbstractValidator<MyRequest>
{
public MyRequestValidator()
{
RuleFor(x => x.Name).NotEmpty();
}
}
// Provide an arbitrary type to register all validators in the assembly of the type:
services
.AddMediatorRequestHandlers(typeof(MyRequest))
.AddMediatorValidation(typeof(MyRequest));In version 2.0 and later, Sidio.Mediator.SourceGenerator includes source generators that create an IMediator service implementation at
compile time. This service works both with requests and request validation.
The IMediator implementation contains a method for each request. For example, a request named MyRequest:
public class MyRequest : IRequest<string>;The generated IMediator will have a method:
Task<Result<string>> MyRequestAsync(MyRequest request, CancellationToken cancellationToken = default);Sidio.Mediator.SourceGenerator in the project that contain the IRequest or IHttpRequest implementations.IMediator service in your Startup.cs or Program.cs:services
.AddMediatorRequestHandlers(typeof(MyRequest)) // register the request handlers
.AddMediatorValidation(typeof(MyRequest)) // register the request validators
.AddMediatorService(); // register the IMediator serviceIRequest, IRequest<T> or IHttpRequest<T>. Inheritance of base/abstract requests is not supported. Inheritance of request handlers should work.<ItemGroup>
<Using Include="MyNamespace" />
</ItemGroup>Sidio.Mediator.