2016-05-19 4 views
1

Iam здание ограниченного контекста с использованием шаблона CQRS. Я подготовил несколько запросов и обработчиков для каждого. И теперь, в уровне представления (http REST controller), я должен использовать его. Вопрос в том, должен ли я вводить каждый обработчик этого контроллера (есть 4 запроса и обработчики) или использовать командную шину и настраивать обработчики прав на указанный запрос?Как обрабатывать обработчики запросов как зависимость?

+1

Извините, если я неправильно понял ваше намерение. Обработка запросов с помощью командной шины на самом деле не является идеей CQRS. Как правило, у вас есть командная шина для отправки команд и отдельных моделей чтения (которые обновляются после выполнения команд) для обработки запросов (которые не изменяют состояние системы). Что делают обработчики запросов? –

ответ

-1

В прошлом мы ввели в контроллер какой-то запрос-исполнитель и передали в него запросы. например,

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.

+1

CQS - это принцип дизайна, ** не ** абстракция. CQRS является результатом применения CQS к модели, опять же ** не ** абстракции. Модель (любая модель) - это абстракция, код - реализация этой абстракции. Не следует путать с деталями реализации, такими как интерфейсы или абстрактные классы. – MikeSW

+0

@MikeSW Это * также * абстракция в контексте ORM. Если у меня есть ORM-интерфейс, который позволяет мне легко отправлять команды и запросы, а затем я их переношу в какую-то реализацию CQS, то это еще одна абстракция. Это все, что я говорил.Если у вас нет ORM, и вы строите adonet с нуля, например, то, возможно, абстракция (как часть реализации принципа разработки) меньше, но все же там. –

+1

Это просто принцип, который не заботится об ORM, поскольку принцип проектирования не должен заботиться о деталях реализации. Я думаю, вы неправильно поняли, что такое CQS/CQRS. – MikeSW

1

Ну, в любом случае кажется, что это имеет смысл; это, вероятно, намек на то, что вы должны проходить через интерфейс , который выражает договор, который Контроллер нуждается в удовлетворении, и останавливает детали реализации ниже уровня.

Я предполагаю, что вы, в конечном счете, не захотите, чтобы контроллер напрямую подключался к обработчикам запросов, потому что это ограничит ваши варианты в ряде случаев использования (пример: управление перегрузкой и противодавление). Но вы не узнаете, пока еще далеко по дороге, так что держите вещи свободными.