/// <summary> /// Raises the given domain event /// </summary> /// <typeparam name="T">Domain event type</typeparam> /// <param name="domainEvent">Domain event</param> public void Raise <T>(T domainEvent) where T : IDomainEvent { //Get all the handlers that handle events of type T IHandles <T>[] allHandlers = (IHandles <T>[])_resolver.GetService(typeof(IHandles <T>[])); if (allHandlers != null && allHandlers.Length > 0) { IHandles <T>[] handlersToEnqueue = null; IHandles <T>[] handlersToFire = allHandlers; if (_dbState.HasPendingChanges()) { //if there is a transaction in progress, events are enqueued to be executed later handlersToEnqueue = allHandlers.Where(h => h.Deferred).ToArray(); if (handlersToEnqueue.Length > 0) { lock (_pendingHandlers) foreach (var handler in handlersToEnqueue) { _pendingHandlers.Enqueue(() => handler.Handle(domainEvent)); } handlersToFire = allHandlers.Except(handlersToEnqueue).ToArray(); } } foreach (var handler in handlersToFire) { handler.Handle(domainEvent); } } }
private void FlushOrClear() { if (!_dbState.HasPendingChanges()) { Flush(); } else { Clear(); } }