2015-03-28 1 views
0

Une fois que l'opération de commande est gérée par le gestionnaire, je lève les événements de domaine. Dans certains cas, il est tolérable qu'un gestionnaire d'événements échoue. Je peux dire que c'est le cas pour la plupart d'entre eux et je veux que tous les gestionnaires d'événements soient tolérables.Les gestionnaires d'événements doivent-ils tirer et oublier

Mon opération doit-elle échouer si un gestionnaire d'événements échoue ou si les gestionnaires d'événements doivent se déclencher et oublier? Par exemple, supposons que c'est l'endroit où je lève les événements et comme vous pouvez le voir, les exceptions potentielles provenant de eventHandler.Execute ne sont pas gérées.

public void Publish<TEvent>(TEvent @event) where TEvent : IDomainEvent 
{ 
    IEnumerable<IEventHandler<TEvent>> handlers = _lifetimeScope.GetService<IEnumerable<IEventHandler<TEvent>>>(); 
    var eventHandlers = handlers as IEventHandler<TEvent>[] ?? handlers.ToArray(); 
    if (eventHandlers.Any()) 
    { 
     foreach (IEventHandler<TEvent> eventHandler in eventHandlers) 
     { 
      eventHandler.Execute(@event); 
     } 
    } 
    else 
    { 
     throw new InvalidOperationException("No handler registered"); 
    } 
} 

Cependant, mon désir est d'avoir quelque chose comme ci-dessous:

public void Publish<TEvent>(TEvent @event) where TEvent : IDomainEvent 
{ 
    IEnumerable<IEventHandler<TEvent>> handlers = _lifetimeScope.GetService<IEnumerable<IEventHandler<TEvent>>>(); 
    var eventHandlers = handlers as IEventHandler<TEvent>[] ?? handlers.ToArray(); 
    if (eventHandlers.Any()) 
    { 
     foreach (IEventHandler<TEvent> eventHandler in eventHandlers) 
     { 
      try 
      { 
       eventHandler.Execute(@event); 
      } 
      catch (Exception ex) 
      { 
       // log the expection 
       // swallow it 
      } 
     } 
    } 
    else 
    { 
     throw new InvalidOperationException("No handler registered"); 
    } 
} 

Répondre

4

je mets habituellement des événements sur un système pub/sous persista et retour du gestionnaire de commande. De cette manière, les gestionnaires d'événements individuels peuvent échouer sans affecter le système principal ou les uns avec les autres.

+0

Bon point! Je penche en fait vers cette route car l'autre voie semble plus fragile mais dans ce cas, il y a une autre possibilité: l'opération échoue-t-elle lorsque l'une des opérations de publication d'événements échoue? Goog pub/sous-système devrait être hautement disponible mais c'est toujours une possibilité. – tugberk

+2

Le gestionnaire de commandes n'a pas échoué si l'événement échoue. Un événement est quelque chose qui est * déjà arrivé *, il ne devrait donc pas avoir d'impact sur le gestionnaire de commandes qu'un abonné a échoué. –