2016-02-29 1 views
1

Interface IHandleMessages a paramètre contravariante TMessage IHandleMessages<in TMessage>SimpleRetryStrategy Échec <TMessage>

ce qui rend possible pour vous inscrire à Ioc Container IHandleMessages<DerivedType> et ont mise en œuvre dans le gestionnaire: IHandleMessages<BaseType>. C'est Ok.

Le problème consiste en wrapper Failed<TMessage> pour les messages ayant échoué, où TMessage n'est pas contravariant. Cela rend impossible d'avoir la mise en œuvre du gestionnaire comme Handler : IHandleMessages<Failed<Base>>

et l'enregistrement dans le conteneur IoC .As<IHandleMessages<Failed<DerivedType>>>()

Je pense que raisonnable d'avoir Failed<in TMessage> mais pas Failed<TMessage>

Que pensez-vous?

Répondre

0

Je n'ai pas considéré ce scénario lorsque j'ai implémenté le mécanisme de tentatives de second niveau dans Rebus, mais je voudrais le supporter.

J'ai ajouté la fonctionnalité à 0.99.36 (qui sera sur NuGet dans quelques jours si les tests passent et tout le reste semble bon).

Cela semble légèrement différent de ce que vous avez proposé, car la co- et la contra-variance ne peuvent être obtenues qu'avec des interfaces. Par conséquent, Rebus distribue maintenant un IFailed<out TMessage>, car alors vous pouvez implémenter, par ex. IHandleMessages<IFailed<AbstractBaseClass>> lorsque le message ayant échoué est DerivedFromAbstractBaseClass.

Gardez un oeil sur NuGet.org - ce sera dans quelques jours :)

En attendant, vous pouvez voir ce que le code ressemble in the accompanying test.