Exemple #1
0
        public void Save(AdditionalEvents additionalEvents)
        {
            var       stream = store.GetOrAdd(additionalEvents.AggregateId, _ => new Stream());
            ArrayList eventList, newEventList;

            do
            {
                eventList = stream.Events;
                if (IsRaceHazard(additionalEvents, eventList))
                {
                    throw new ConcurrencyConflictOccurred();
                }
                newEventList = eventList == null ? new ArrayList() : (ArrayList)eventList.Clone();
                newEventList.AddRange(additionalEvents.Events);
            } while (Interlocked.CompareExchange(
                         ref stream.Events, newEventList, eventList) != eventList);
        }
Exemple #2
0
 private static bool IsRaceHazard(AdditionalEvents additionalEvents, ArrayList eventList) =>
 (eventList == null ? 0 : eventList.Count) != additionalEvents.PrecedingEventCount;