помимо ICommand и ICommandHandler создаётся ещё некий ICommandProcessor, который и инджектится через DI в контроллеры и пр. Внутри него есть некий резолвер, который содержит в себе все хендлеры для каждой команды, то есть этакий IServiceProvider. Реализация его единственного метода HandleAsync у меня получилась примерно такая:
Task ProcessAsync<TCommand>(TCommand command) {
var handler = _serviceProvider.GetService(typeof(ICommandHandler<TCommand>));
if (handler is null) throw...
return await handler.HandleAsync();
}
И вот вопрос: в чём выигрыш относительно обычного репозитория? В случае репозитория у меня есть единственный интерфейс, с которым всё понятно. Здесь же для одного запроса мне приходится использовать три класса (DTO, Handler, Processor), причём не факт, что в рантайме мой ICommandProcessor не свалится с эксепшином из-за ненайденного хендлера.
Я вижу только плюс в том, что я избавился от потенциального god object'a. Или я чего-то не понимаю?
Апну свой ночной вопрос
Обсуждают сегодня