public void Update(GoalId Id, Action<GoalAggreagate> execute) { while (true) { EventStream eventStream = _eventStore.LoadEventStream(Id); GoalAggreagate goal = new GoalAggreagate(eventStream.Events); execute(goal); try { _eventStore.AppendToStream(Id, eventStream.Version, goal.Changes); return; } catch (OptimisticConcurrencyException ex) { foreach (var goalEvent in goal.Changes) { foreach (var actualEvent in ex.ActualEvents) { if (ConflictsWith(goalEvent, actualEvent)) { var msg = string.Format("Conflict between {0} and {1}", goalEvent, actualEvent); throw new RealConcurrencyException(msg, ex); } } } _eventStore.AppendToStream(Id, ex.ActualVersion, goal.Changes); } } }
public void Update(GoalId Id, Action <GoalAggreagate> execute) { while (true) { EventStream eventStream = _eventStore.LoadEventStream(Id); GoalAggreagate goal = new GoalAggreagate(eventStream.Events); execute(goal); try { _eventStore.AppendToStream(Id, eventStream.Version, goal.Changes); return; } catch (OptimisticConcurrencyException ex) { foreach (var goalEvent in goal.Changes) { foreach (var actualEvent in ex.ActualEvents) { if (ConflictsWith(goalEvent, actualEvent)) { var msg = string.Format("Conflict between {0} and {1}", goalEvent, actualEvent); throw new RealConcurrencyException(msg, ex); } } } _eventStore.AppendToStream(Id, ex.ActualVersion, goal.Changes); } } }