YITC.DotNetCore.Mediator
16.30.0.4
dotnet add package YITC.DotNetCore.Mediator --version 16.30.0.4
NuGet\Install-Package YITC.DotNetCore.Mediator -Version 16.30.0.4
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="YITC.DotNetCore.Mediator" Version="16.30.0.4" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add YITC.DotNetCore.Mediator --version 16.30.0.4
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: YITC.DotNetCore.Mediator, 16.30.0.4"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install YITC.DotNetCore.Mediator as a Cake Addin #addin nuget:?package=YITC.DotNetCore.Mediator&version=16.30.0.4 // Install YITC.DotNetCore.Mediator as a Cake Tool #tool nuget:?package=YITC.DotNetCore.Mediator&version=16.30.0.4
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
DotNetCore.Mediator
The smallest, simplest and fastest implementation of the mediator pattern.
Tests
[TestClass]
public class MediatorTests
{
private readonly IMediator _mediator;
public MediatorTests()
{
var services = new ServiceCollection();
services.AddMediator(typeof(MediatorTests).Assembly);
_mediator = services.BuildServiceProvider().GetRequiredService<IMediator>();
}
[TestMethod]
public void CategoryByIdQuery()
{
var query = new CategoryByIdQuery(1);
var response = _mediator.HandleAsync<CategoryByIdQuery, Category>(query).Result;
Assert.IsTrue(response.Succeeded && response.Data != default);
}
[TestMethod]
[ExpectedException(typeof(AggregateException))]
public void DeleteCategoryCommandShouldThrowException()
{
var command = new DeleteCategoryCommand(1);
_mediator.HandleAsync(command).Wait();
}
[TestMethod]
public void InsertCategoryCommand()
{
var command = new InsertCategoryCommand("Name");
var response = _mediator.HandleAsync<InsertCategoryCommand, long>(command).Result;
Assert.IsTrue(response.Succeeded && response.Data > 0);
}
[TestMethod]
public void InsertCategoryCommandShouldValidationFail()
{
var command = new InsertCategoryCommand(string.Empty);
var response = _mediator.HandleAsync<InsertCategoryCommand, long>(command).Result;
Assert.IsTrue(response.Failed);
}
[TestMethod]
public void UpdateCategoryCommand()
{
var command = new UpdateCategoryCommand(1, "Name");
var response = _mediator.HandleAsync(command).Result;
Assert.IsTrue(response.Succeeded);
}
}
ASP.NET Core Startup Example
public sealed class Startup
{
public void ConfigureServices(IServiceCollection services)
{
/// AnyType = any type within the project containing commands, queries, events, validators and handlers
services.AddMediator(typeof(AnyType).Assembly);
}
}
ASP.NET Core Controller Example
public sealed class Controller : ControllerBase
{
private readonly IMediator _mediator;
public Controller(IMediator mediator)
{
_mediator = mediator;
}
}
Query
public sealed record CategoryByIdQuery(long Id);
QueryHandler
public sealed class CategoryByIdQueryHandler : IHandler<CategoryByIdQuery, Category>
{
public Task<IResult<Category>> HandleAsync(CategoryByIdQuery request)
{
var category = new Category(request.Id, nameof(Category));
return Task.FromResult(category.Success());
}
}
Command
public sealed record InsertCategoryCommand(string Name);
CommandHandler
public sealed class InsertCategoryCommandHandler : IHandler<InsertCategoryCommand, long>
{
public Task<IResult<long>> HandleAsync(InsertCategoryCommand request)
{
return Task.FromResult(1L.Success());
}
}
CommandValidator
public class InsertCategoryCommandValidator : AbstractValidator<InsertCategoryCommand>
{
public InsertCategoryCommandValidator()
{
RuleFor(category => category.Name).NotEmpty();
}
}
Command
public sealed record UpdateCategoryCommand(long Id, string Name);
CommandHandler
public sealed class UpdateCategoryCommandHandler : IHandler<UpdateCategoryCommand>
{
private readonly IMediator _mediator;
public UpdateCategoryCommandHandler(IMediator mediator)
{
_mediator = mediator;
}
public async Task<IResult> HandleAsync(UpdateCategoryCommand request)
{
var category = new Category(request.Id, request.Name);
var updatedCategoryEvent = new UpdatedCategoryEvent(category);
await _mediator.HandleAsync(updatedCategoryEvent).ConfigureAwait(false);
return Result.Success();
}
}
Event
public sealed record UpdatedCategoryEvent(Category Category);
EventHandler
public sealed class UpdatedCategoryEventHandler : IHandler<UpdatedCategoryEvent>
{
public Task<IResult> HandleAsync(UpdatedCategoryEvent request)
{
return Task.FromResult(Result.Success());
}
}
Mediator
public interface IMediator
{
Task<IResult> HandleAsync<TRequest>(TRequest request);
Task<IResult<TResponse>> HandleAsync<TRequest, TResponse>(TRequest request);
}
public sealed class Mediator : IMediator
{
public async Task<IResult> HandleAsync<TRequest>(TRequest request) { }
public async Task<IResult<TResponse>> HandleAsync<TRequest, TResponse>(TRequest request) { }
}
public interface IHandler<TRequest>
{
Task<IResult> HandleAsync(TRequest request);
}
public interface IHandler<TRequest, TResponse>
{
Task<IResult<TResponse>> HandleAsync(TRequest request);
}
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
-
net6.0
- FluentValidation (>= 10.4.0)
- Microsoft.Extensions.DependencyInjection (>= 6.0.0)
- YITC.DotNetCore.Results (>= 16.30.0.4)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
16.30.0.4 | 483 | 4/15/2022 |
16.26.0.3 | 418 | 3/17/2022 |
16.26.0.2-yitc | 159 | 3/16/2022 |
16.26.0 | 415 | 3/16/2022 |
16.26.0-yitc | 155 | 3/16/2022 |