private void RegisterListeners(IUnitOfWork unitOfWork) { unitOfWork.OnPrepareCommit(u => _phaseTransitoins.Add(new PhaseTransition(u, Phase.PREPARE_COMMIT))); unitOfWork.OnCommit(u => _phaseTransitoins.Add(new PhaseTransition(u, Phase.COMMIT))); unitOfWork.AfterCommit(u => _phaseTransitoins.Add(new PhaseTransition(u, Phase.AFTER_COMMIT))); unitOfWork.OnRollback(u => _phaseTransitoins.Add(new PhaseTransition(u, Phase.ROLLBACK))); unitOfWork.OnCleanup(u => _phaseTransitoins.Add(new PhaseTransition(u, Phase.CLEANUP))); }
private List <IEventMessage> EventsQueue(IUnitOfWork unitOfWork) { return(unitOfWork.GetOrComputeResource(_eventsKey, r => { var eventQueue = new List <IEventMessage>(); unitOfWork.OnPrepareCommit(u => { if (u.Parent.IsPresent && !u.Parent.Get().Phase.IsAfter(Phase.COMMIT)) { EventsQueue(u.Parent.Get()).AddRange(eventQueue); } else { int processedItems = eventQueue.Count; DoWithEvents(PrepareCommit, Intercept(eventQueue)); // make sure events published during publication prepare commit phase are also published while (processedItems < eventQueue.Count) { var newMessages = Intercept(eventQueue.GetRange(processedItems, eventQueue.Count)); processedItems = eventQueue.Count; DoWithEvents(PrepareCommit, newMessages); } } }); unitOfWork.OnCommit(u => { if (u.Parent.IsPresent && !u.Root().Phase.IsAfter(Phase.COMMIT)) { u.Root().OnCommit(w => DoWithEvents(Commit, eventQueue)); } else { DoWithEvents(Commit, eventQueue); } }); unitOfWork.AfterCommit(u => { if (u.Parent.IsPresent && !u.Root().Phase.IsAfter(Phase.AFTER_COMMIT)) { u.Root().AfterCommit(w => DoWithEvents(AfterCommit, eventQueue)); } else { DoWithEvents(AfterCommit, eventQueue); } }); unitOfWork.OnCleanup(u => u.Resources.Remove(_eventsKey)); return eventQueue; })); }