public virtual void DeleteId(Guid id)
        {
            this.Repository.DeleteId(id);

            var modelChange = NotificationExtensions.CreateModelNotification(id, null, ModelChangeKind.Deleted);

            this.changes.OnNext(modelChange);
        }
        public virtual void Delete(T instance)
        {
            this.Repository.Delete(instance);

            var modelChange = NotificationExtensions.CreateModelNotification(instance.Identity, null, ModelChangeKind.Deleted);

            this.changes.OnNext(modelChange);
        }
        private void PublishEvents(IAggregateRoot instance, IDomainNotification snapshotChange)
        {
            foreach (var evt in instance.UncommittedEvents.ToList())
            {
                var modelChange = NotificationExtensions.CreateNotification(instance.GetType(), evt);
                this.changes.OnNext(modelChange);
            }

            if (snapshotChange != null)
            {
                this.changes.OnNext(snapshotChange);
            }
        }
        private IDomainNotification SaveSnapshot(IAggregateRoot instance, int expectedVersion)
        {
            if (this.snapshotRepository != null && this.ShouldSaveSnapshot(instance))
            {
                var snapshot = ((ISnapshotSupport)instance).GetSnapshot();

                // we have to pass expected version if we don't have an event store
                SaveResult saveResult;
                if (this.eventStore == null)
                {
                    saveResult = this.snapshotRepository.Save(snapshot, expectedVersion);
                }
                else
                {
                    saveResult = this.snapshotRepository.Save(snapshot);
                }

                return(NotificationExtensions.CreateModelNotification(instance.Identity, snapshot, saveResult == SaveResult.Added ? ModelChangeKind.Added : ModelChangeKind.Changed));
            }

            return(null);
        }
        public virtual SaveResult Save(T instance)
        {
            var saveResult = this.Repository.Save(instance);

            IDomainNotification modelChange = null;

            switch (saveResult)
            {
            case SaveResult.Added:
                modelChange = NotificationExtensions.CreateModelNotification(instance.Identity, instance, ModelChangeKind.Added);
                break;

            case SaveResult.Updated:
                modelChange = NotificationExtensions.CreateModelNotification(instance.Identity, instance, ModelChangeKind.Changed);
                break;
            }

            if (modelChange != null)
            {
                this.changes.OnNext(modelChange);
            }

            return(saveResult);
        }