Example #1
0
        public SaveResult Save(T instance)
        {
            if (!instance.UncommittedEvents.Any())
            {
                return(SaveResult.None);
            }

            var current = this.GetById(instance.Identity);

            int expectedVersion = instance.UncommittedEvents.First().Version - 1;

            if ((current == null && expectedVersion != 0) || (current != null && current.Version != expectedVersion))
            {
                throw new ConcurrencyException();
            }

            var snapshot = ((ISnapshotSupport)instance).GetSnapshot() as ISnapshot;

            this.manifest.UpdateManifest(instance.Identity, expectedVersion, snapshot.Version);

            var saveResult = this.repository.Save(snapshot);

            IDataChangeEvent modelChange = null;

            switch (saveResult)
            {
            case SaveResult.Added:
                modelChange = new DataChangeEvent(snapshot.GetType(), snapshot.Identity, snapshot, DataChangeKind.Added);
                break;

            case SaveResult.Updated:
                modelChange = new DataChangeEvent(snapshot.GetType(), snapshot.Identity, snapshot, DataChangeKind.Changed);
                break;
            }

            this.changes.OnNext(modelChange);

            this.PublishEvents(instance.UncommittedEvents);
            instance.Commit();

            return(expectedVersion == 0 ? SaveResult.Added : SaveResult.Updated);
        }
Example #2
0
        public virtual SaveResult Save(T instance)
        {
            var result = SaveResult.Updated;

//            SynchronousTask.DoSync(() => {
//                //Console.WriteLine(string.Format("SqlRepo - Save {0} {1}", instance.GetType(),instance.Identity));
//
//                if (this.Connection.Update(instance) == 0)
//                {
//                    this.Connection.Insert(instance);
//                    result = SaveResult.Added;
//                }
//            });
            lock (this.Connection)
            {
                if (this.Connection.Update(instance) == 0)
                {
                    this.Connection.Insert(instance);
                    result = SaveResult.Added;
                }
            }

            IDataChangeEvent modelChange = null;

            switch (result)
            {
            case SaveResult.Added:
                modelChange = new DataChangeEvent <T>(instance.Identity, instance, DataChangeKind.Added);
                break;

            case SaveResult.Updated:
                modelChange = new DataChangeEvent <T>(instance.Identity, instance, DataChangeKind.Changed);
                break;
            }

            this.changes.OnNext(modelChange);

            return(result);
        }
Example #3
0
 public static INotificationEvent AsDomainEvent(this IDataChangeEvent dataChange)
 {
     return(new NotificationEvent(dataChange.DataType, dataChange.DataId, dataChange));
 }