namespace TheXamlGuy.TaskbarGroup.Core { public class Mediator : IMediator { private readonly IServiceFactory serviceFactory; public Mediator(IServiceFactory serviceFactory) { this.serviceFactory = serviceFactory; } public void Handle() where TEvent : new() { Handle(new TEvent()); } public TResponse Handle(params object[] parameters) where TRequest : new() { return Handle(new TRequest(), parameters); } public void Handle(object request, params object[] parameters) { GetHandler(typeof(IMessageHandler<>).MakeGenericType(request.GetType()), parameters) .Handle((dynamic)request); } public TResponse Handle(object request, params object[] parameters) { return GetHandler(typeof(IMessageHandler<,>).MakeGenericType(typeof(TResponse), request.GetType()), parameters) .Handle((dynamic)request); } public Task HandleAsync() where TEvent : new() { return HandleAsync(new TEvent()); } public Task HandleAsync(params object[] parameters) where TRequest : new() { return HandleAsync(new TRequest(), parameters); } public Task HandleAsync(object request, CancellationToken cancellationToken, params object[] parameters) { return GetHandler(typeof(IAsyncMessageHandler<>).MakeGenericType(request.GetType()), parameters) .Handle((dynamic)request, cancellationToken); } public Task HandleAsync(object request, params object[] parameters) { return HandleAsync(request, CancellationToken.None, parameters); } public Task HandleAsync(object request, CancellationToken cancellationToken, params object[] parameters) { return GetHandler(typeof(IAsyncMessageHandler<,>).MakeGenericType(typeof(TResponse), request.GetType()), parameters) .Handle((dynamic)request, cancellationToken); } public Task HandleAsync(object request, params object[] parameters) { return HandleAsync(request, CancellationToken.None, parameters); } private dynamic GetHandler(Type type, params object[] parameters) { return parameters.Length == 0 ? serviceFactory.Create(type) : serviceFactory.Create(type, parameters); } } }