Iam здание ограниченного контекста с использованием шаблона CQRS. Я подготовил несколько запросов и обработчиков для каждого. И теперь, в уровне представления (http REST controller), я должен использовать его. Вопрос в том, должен ли я вводить каждый обработчик этого контроллера (есть 4 запроса и обработчики) или использовать командную шину и настраивать обработчики прав на указанный запрос?Как обрабатывать обработчики запросов как зависимость?
ответ
В прошлом мы ввели в контроллер какой-то запрос-исполнитель и передали в него запросы. например,
public SomeController(IQueryExecutor queryExecutor) { ...
, а затем
var results = queryExecutor.Query(new GetSomeThings(args..));
Обработчик GetSomeThings
подключен вверх вспомогательной инфраструктуры, поэтому вам не нужно вводить их. Имеет ли это смысл?
Слово предупреждения о CQRS/CQS:
Если вы обнаружили, что написание запросов и обработчики, которые используются в большинстве только один или два раза, или команды, которые предназначены для контроллера, который использует их, то, возможно, CQRS/CQS - это абстракция, на которую вам фактически не нужно платить дополнительную стоимость сложности.
Мои команды и я обнаружили, что это верно для ряда проектов. Часто CQRS/CQS - это еще одна ненужная абстракция, такая как репозиторий, который отправляет в ORM lib или «Сервис», который имеет один или два линейных рассылки в репозиторий, который ...
Надеюсь, вы поняли.
Мне нравится Rule Of Three - не пытайтесь получить повторное использование до тех пор, пока у вас не будет более трех применений. И даже тогда, не прыгайте глубоко в нечто тяжелое и очень прописанное, как CQRS/CQS, если оно вам не нужно. DDD - это очень kool, но вы можете выбрать, какие элементы его имеют смысл для вас. Часто многое из этого не имеет смысла, когда вы применяете прагматичные рассуждения.
Только мои 2 c.
CQS - это принцип дизайна, ** не ** абстракция. CQRS является результатом применения CQS к модели, опять же ** не ** абстракции. Модель (любая модель) - это абстракция, код - реализация этой абстракции. Не следует путать с деталями реализации, такими как интерфейсы или абстрактные классы. – MikeSW
@MikeSW Это * также * абстракция в контексте ORM. Если у меня есть ORM-интерфейс, который позволяет мне легко отправлять команды и запросы, а затем я их переношу в какую-то реализацию CQS, то это еще одна абстракция. Это все, что я говорил.Если у вас нет ORM, и вы строите adonet с нуля, например, то, возможно, абстракция (как часть реализации принципа разработки) меньше, но все же там. –
Это просто принцип, который не заботится об ORM, поскольку принцип проектирования не должен заботиться о деталях реализации. Я думаю, вы неправильно поняли, что такое CQS/CQRS. – MikeSW
Ну, в любом случае кажется, что это имеет смысл; это, вероятно, намек на то, что вы должны проходить через интерфейс , который выражает договор, который Контроллер нуждается в удовлетворении, и останавливает детали реализации ниже уровня.
Я предполагаю, что вы, в конечном счете, не захотите, чтобы контроллер напрямую подключался к обработчикам запросов, потому что это ограничит ваши варианты в ряде случаев использования (пример: управление перегрузкой и противодавление). Но вы не узнаете, пока еще далеко по дороге, так что держите вещи свободными.
Извините, если я неправильно понял ваше намерение. Обработка запросов с помощью командной шины на самом деле не является идеей CQRS. Как правило, у вас есть командная шина для отправки команд и отдельных моделей чтения (которые обновляются после выполнения команд) для обработки запросов (которые не изменяют состояние системы). Что делают обработчики запросов? –