Как создать посредника для обработки команд?

Реализую паттерн CQRS и задался вопросом того как реализовать посредника для исполнения команд, у меня есть интерфейс ICommand, который помечает, что данный объект это команда

public interface ICommand
{

}

И есть hanlder для этой команды

И есть интерфейс, который обрабатывает эту команду

public interface ICommandHandler<in TCommand> where TCommand : ICommand
{
    Task HandleAsync(TCommand command, CancellationToken cancellationToken = default);
}

public interface ICommandHandler<in TCommand, TResult> where TCommand : ICommand
{
    Task<TResult> HandleAsync(TCommand command, CancellationToken cancellationToken = default);
}

И как для этого можно создать промежуточный объект, который будет принимать команду и будет знать какой обработчик ему вызвать?

UPD. пока сделал так: public class CommandDispatcher : ICommandDispatcher { private readonly IServiceProvider _serviceProvider;

    public CommandDispatcher(IServiceProvider serviceProvider)
    {
        _serviceProvider = serviceProvider ??
                           throw new ArgumentNullException(nameof(serviceProvider));
    }

    public Task ExecuteAsync<TCommand>(TCommand command, CancellationToken cancellationToken = default) where TCommand : ICommand
    {
        var handler = _serviceProvider.GetService<ICommandHandler<TCommand>>();

        if(handler == null)
            throw new ArgumentNullException(nameof(handler));
        
        return handler.HandleAsync(command, cancellationToken);
    }

    public Task<TResult> ExecuteAsync<TCommand, TResult>(TCommand command, CancellationToken cancellationToken = default)
        where TCommand : ICommand
    {
        var handler = _serviceProvider.GetService<ICommandHandler<TCommand, TResult>>();

        if (handler == null)
            throw new ArgumentNullException(nameof(handler));

        return handler.HandleAsync(command, cancellationToken);
    }
}

Ответы (0 шт):