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