2016-02-29 1 views
1

IHandleMessages имеет контравариантен параметр TMessage IHandleMessages<in TMessage>SimpleRetryStrategy Failed интерфейс <TMessage>

это позволяет зарегистрировать в IoC контейнер IHandleMessages<DerivedType> и иметь реализацию в обработчике: IHandleMessages<BaseType>. Все в порядке.

Проблема состоит в том, что обертка для сообщений с ошибкой Failed<TMessage>, где TMessage не является контравариантной. Это делает невозможным иметь реализацию Handler как Handler : IHandleMessages<Failed<Base>>

и регистрации в IoC контейнер .As<IHandleMessages<Failed<DerivedType>>>()

Я думаю, что его разумно иметь Failed<in TMessage> но не Failed<TMessage>

Что вы думаете?

ответ

0

Я не рассматривал этот сценарий, когда я реализовал механизм повторных попыток второго уровня в Rebus, но я хотел бы его поддержать.

Я добавил функцию к 0.99.36 (которая будет на NuGet через несколько дней, если тесты пройдут, и все остальное будет выглядеть хорошо).

Он немного отличается от того, что вы предлагали, поскольку совпадение и противоречие могут быть связаны только с интерфейсами.

Следовательно, Rebus теперь отправляет IFailed<out TMessage>, потому что тогда вы можете реализовать, например. IHandleMessages<IFailed<AbstractBaseClass>>, когда сообщение об ошибке DerivedFromAbstractBaseClass.

Держите глаз на NuGet.org - это будет в течение нескольких дней :)

В то же время вы можете увидеть, что код выглядит in the accompanying test.

Смежные вопросы