Как создать посредника для обработки команд?
Реализую паттерн 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);
}
}