Пример #1
0
        /// <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();
     }
 }