Иметь один Request/RequestHandler для всех входящих запросов

Я успешно использую MediatR в своем текущем проекте. Идея использования посредника Конвейер для решения сквозных проблем действительно хорош.

Одна вещь, которую я не понимаю (и, возможно, причина в том, что я не знаком с С# ковариантность/контравариантность) — как я могу обрабатывать все входящие запросы в одном обработчике? Я хотел бы выполнить действие до выполнения запроса независимо от его типа:

IRequest

or

IRequest<Foo>

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

Любые идеи, пожалуйста?


person Andre Gallo    schedule 20.10.2015    source источник
comment
Не знаю, что такое MediatR, но разве IRequest<T> не наследуется от IRequest? Если нет, то это было бы довольно глупо. Редактировать: согласно источнику, IRequest : IRequest<Unit>, где Unit — общий параметр out. Конечно, вы можете что-то с этим сделать, например, позволив вашему Foo наследоваться от Unit.   -  person CodeCaster    schedule 20.10.2015
comment
Тогда я бы сделал так, чтобы все мои выходные параметры наследовались от Unit, что кажется неосуществимым?   -  person Andre Gallo    schedule 20.10.2015


Ответы (1)


Вот как я это делаю с Castle Windsor и Mediatr (допустим, мы хотим регистрировать и авторизовать вызовы для каждого обработчика). См. суть, которую я сделал: модульный тест декоратора

Обратите внимание, что при регистрации обработчиков в контейнере (в моем случае Castle Windsor) вам необходимо зарегистрировать их в правильном порядке (по крайней мере, в Windsor, YMMV).

Также обратите внимание, что я делаю исключения при регистрации компонента (для декораторов регистрируйте все конкретные типы, за исключением других обработчиков декораторов).

person Bredstik    schedule 06.11.2015