예제 #1
0
        public IList <IQueuedEvent> BatchEvents(IList <IQueuedEvent> eventItems)
        {
            List <IQueuedEvent> outputEvents;

            if (eventItems.Count == 0)
            {
                outputEvents = new List <IQueuedEvent>(0);
                return(outputEvents);
            }
            if (eventItems.Count == 1)
            {
                outputEvents = new List <IQueuedEvent>(1);
                IQueuedEvent soleEvent = eventItems[0];
                outputEvents.Add(soleEvent);
                return(outputEvents);
            }
            outputEvents = new List <IQueuedEvent>();
            IList <IQueuedEvent> currentBatchableEvents = new List <IQueuedEvent>();

            IList <IQueuedEvent> batchedEvents;
            IEventBatcher        currentEventBatcher = null;

            for (int i = 0, size = eventItems.Count; i < size; i++)
            {
                IQueuedEvent  queuedEvent  = eventItems[i];
                Object        eventObject  = queuedEvent.EventObject;
                IEventBatcher eventBatcher = typeToBatchersDict.GetExtension(eventObject.GetType());
                if (eventBatcher != null)
                {
                    if (currentEventBatcher != null && !eventBatcher.Equals(currentEventBatcher))
                    {
                        batchedEvents = BatchEventsIntern(currentBatchableEvents, currentEventBatcher);
                        if (batchedEvents != null)
                        {
                            outputEvents.AddRange(batchedEvents);
                        }
                        currentBatchableEvents.Clear();
                    }
                    currentEventBatcher = eventBatcher;
                    currentBatchableEvents.Add(queuedEvent);
                    continue;
                }
                batchedEvents = BatchEventsIntern(currentBatchableEvents, currentEventBatcher);
                if (batchedEvents != null)
                {
                    outputEvents.AddRange(batchedEvents);
                }
                currentBatchableEvents.Clear();
                currentEventBatcher = null;
                outputEvents.Add(queuedEvent);
            }
            batchedEvents = BatchEventsIntern(currentBatchableEvents, currentEventBatcher);
            if (batchedEvents != null)
            {
                outputEvents.AddRange(batchedEvents);
            }
            return(outputEvents);
        }
예제 #2
0
 public void UnregisterEventBatcher(IEventBatcher eventBatcher, Type eventType)
 {
     typeToBatchersDict.Unregister(eventBatcher, eventType);
 }
예제 #3
0
 protected IList <IQueuedEvent> BatchEventsIntern(IList <IQueuedEvent> currentBatchableEvents, IEventBatcher currentEventBatcher)
 {
     if (currentBatchableEvents.Count == 0)
     {
         return(null);
     }
     if (currentBatchableEvents.Count == 1 || currentEventBatcher == null)
     {
         List <IQueuedEvent> batchedEvents = new List <IQueuedEvent>(currentBatchableEvents.Count);
         batchedEvents.AddRange(currentBatchableEvents);
         return(batchedEvents);
     }
     else
     {
         return(currentEventBatcher.BatchEvents(currentBatchableEvents));
     }
 }