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); }
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); }
public static INotificationEvent AsDomainEvent(this IDataChangeEvent dataChange) { return(new NotificationEvent(dataChange.DataType, dataChange.DataId, dataChange)); }