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);
                }
            }
        }