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");
}
}
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
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é. –