У меня есть некоторые мысли по поводу дизайна командирской части в CQRS.Я хочу услышать ваше мнение о моих мыслях.Заранее спасибо!:)
В CQRS есть команды и исполнители команд.Иногда мы хотим, чтобы исполнители команд возвращали некоторый результат после завершения выполнения.Одним из возможных решений является (C #):
public interface ICommandExecutor<TCommand>
{
void Execute(TCommand cmd);
}
public interface ICommandExecutor<TCommand, TResult>
{
TResult Execute(TCommand cmd);
}
Хорошо до сих пор.Мы используем два интерфейса для выполнения команд.Теперь давайте посмотрим код клиента:
var cmd = new MyCommand();
commandBus.Execute(cmd); // execute no result
commandBus.Execute<MyResult>(cmd); // execute result
Да, мы можем позволить exeuctor возвращать результат сейчас.Но программист может сбить с толку при написании приведенного выше кода: может ли эта команда выполнить результат или нет ??Чтобы получить ответ, программист должен изучить исходный код фреймворка, чтобы узнать, есть ли MyCommandExecutor или MyCommandExecutor.Это плохо!Очень запутанно!
Так что, на мой взгляд, мы должны DELETE ICommandExecutor<TCommand, TResult>
.То есть Я думаю, что исполнители команд всегда должны возвращать void.Дизайн ICommandExecutor<TCommand, TResult>
плохой!
Если нам нужно посмотреть, что изменилось после выполнения команды.Мы должны сделать новый запрос к базе данных после вызова commandBus.Execute (cmd).
Что вы думаете об этом?