DotaCore.Mediator 15.2.1

Install-Package DotaCore.Mediator -Version 15.2.1
dotnet add package DotaCore.Mediator --version 15.2.1
<PackageReference Include="DotaCore.Mediator" Version="15.2.1" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add DotaCore.Mediator --version 15.2.1
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: DotaCore.Mediator, 15.2.1"
#r directive can be used in F# Interactive, C# scripting and .NET Interactive. Copy this into the interactive tool or source code of the script to reference the package.
// Install DotaCore.Mediator as a Cake Addin
#addin nuget:?package=DotaCore.Mediator&version=15.2.1

// Install DotaCore.Mediator as a Cake Tool
#tool nuget:?package=DotaCore.Mediator&version=15.2.1
The NuGet Team does not provide support for this client. Please contact its maintainers for support.

DotaCore.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);
}

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
15.2.1 78 4/4/2021