2017-07-12 4 views
1

J'utilise Rebus 3.0.1 avec Simpleinjector. Je me suis inscrit un décorateur, pour l'exploitation forestière, de tous les gestionnaires, de cette façon:ReBus: Impossible d'utiliser les sagas avec les gestionnaires décorateur

container.RegisterDecorator(typeof(IHandleMessages<>), typeof(HandlerLogDecorator<>)); 


Tout fonctionne très bien, à l'exception du Sagas: parce que, dans LoadSagaDataStep, le code suivant

  var handlerInvokersForSagas = context.Load<HandlerInvokers>() 
      .Where(l => l.HasSaga) 
      .ToList(); 

n'est pas en mesure de trouver la Saga sous les couvertures.
Si je désinscrit les décorateurs, la saga recommence à fonctionner.

Une suggestion pour concilier les sagas et les décorateurs handlers?

Répondre

1

Malheureusement, comme vous l'avez découvert, Rebus ne s'attend pas à ce que les gestionnaires (y compris les sagas) soient emballés dans des décorateurs.

Il utilise décorateurs beaucoup pour diverses choses à l'intérieur, et il encourage l'utilisation de décorateurs comme point d'extension pour les développeurs, mais cela ne va pour tous les services de Rebus comme IPipeline, ISubscriptionStorage, etc.

Si vous voulez connecter des choses par rapport à la gestion des messages, un meilleur point d'extension serait soit

a) utiliser Rebus.Events et il suffit d'installer un gestionnaire d'événements comme celui-ci:

Configure.With(...) 
    .(...) 
    .Events(e => { 
     e.AfterMessageHandled += (bus, headers, message, context, args) => { 
      // log stuff in here :) 
     }; 
    }) 
    .Start(); 

ou

b) créer une étape de pipeline entrant que les journaux ce que vous voulez vous connecter comme ceci:

Configure.With(...) 
    .(...) 
    .Options(o => { 
     o.Decorate<IPipeline>(c => { 
      var step = new YourLoggingStep(); 
      var pipeline = c.Get<IPipeline>(); 

      return new PipelineStepInjector(pipeline) 
       .OnReceive(step, PipelineRelativePosition.After, typeof(DeserializeIncomingMessageStep)); 
     }); 
    }) 
    .Start(); 

emballage probablement toutes les choses laides dans une méthode d'extension qui donne un aspect d'utilisation plus comme ceci:

Configure.With(...) 
    .(...) 
    .Options(o => { 
     o.LogHandledMessages(); 
    }) 
    .Start(); 
+0

Désolé je pensais que la réponse a résolu le problème, mais ce n'est pas le cas. Maintenant que j'allais mettre la main dessus, j'ai remarqué que la décoration du pipeline n'est pas la même chose que la décoration des manutentionnaires. En fait, vous ne pouvez pas décorer l'unique exécution de 'await invoker.Invoke();' mais l'exécution de la liste de 'HandlerInvokers' (ce que fait déjà Rebus). Des suggestions? – ilcorvo

+0

Extrema ratio serait de remplacer 'DispatchIncomingMessageStep' dans le pipeline, mais je ne l'aime pas parce que' DispatchIncomingMessageStep' est une partie centrale de la structure. – ilcorvo