public DeferredObjectChange(IObjectChange <TPrincipal> objectChange, Func <string> deferredReference, ISerializationManager serializer) { this.objectChange = objectChange; this.futureReference = new DeferredValue(deferredReference); this.futureValues = new DeferredValueMap(objectChange); this.serializer = serializer; }
protected virtual IPropertyChange<TPrincipal> primaryKeyChange<T>(IObjectChange<TPrincipal> change) { var model = Activator.CreateInstance(typeof(T), true); string primaryKeyField = GetReferencePropertyForObject(model); return change.PropertyChanges .SingleOrDefault(p => p.PropertyName == primaryKeyField); }
private void record(IObjectChange <TPrincipal> objectChange, string propertyName, Func <object> deferredValue, Func <object> oldValue) { IPropertyChange <TPrincipal> propertyChange = getPropertyChangeFor(objectChange, propertyName); if (deferredValue != null) { deferredValues.Store(objectChange, propertyName, deferredValue, oldValue); } }
private void bake(IObjectChange <TPrincipal> objectChange) { var bakedValues = deferredValues.CalculateAndRetrieve(objectChange); foreach (KeyValuePair <string, Tuple <object, object> > kv in bakedValues) { var propertyChange = getPropertyChangeFor(objectChange, kv.Key); setValue(propertyChange, kv.Value.Item1, kv.Value.Item2); } }
private IPropertyChange <TPrincipal> getPropertyChangeFor(IObjectChange <TPrincipal> objectChange, string propertyName) { var result = objectChange.PropertyChanges.SingleOrDefault(pc => pc.PropertyName == propertyName); if (result == null) { result = factory.PropertyChange(); result.ObjectChange = objectChange; result.PropertyName = propertyName; result.Value = null; result.ValueAsInt = null; objectChange.Add(result); } return(result); }
protected virtual IChange <TModel, TPrincipal> apply <TModel>(IObjectChange <TPrincipal> change, TModel model) where TModel : ICloneable { var type = typeof(TModel); var newVersion = (TModel)model.Clone(); foreach (var propertyChange in change.PropertyChanges) { var property = model.GetType().GetProperty(propertyChange.PropertyName, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); var value = bind(propertyChange.Value, property.PropertyType); property.SetValue(newVersion, value, null); } return(new Change <TModel, TPrincipal>(newVersion, change.ChangeSet.Author, change.ChangeSet.Timestamp)); }
/// <summary> /// Returns whether the object change consists of adding a new entity, /// deleting an entity, or modifying an existing entity /// </summary> public virtual ChangeType TypeOfChange<TModel>(IObjectChange<TPrincipal> change) { var keyChange = primaryKeyChange<TModel>(change); if (keyChange == null) return ChangeType.Modify; else { if (keyChange.Value == null) { return ChangeType.Delete; } else { return ChangeType.Add; } } }
protected virtual IChange<TModel, TPrincipal> apply<TModel>(IObjectChange<TPrincipal> change, TModel model, string prefix) { var type = typeof(TModel); var newVersion = clone(model); var errors = new List<Exception>(); foreach (var propertyChange in change.PropertyChanges.Select(p => new PropertyChangeProcessor<TPrincipal>(p))) { try { propertyChange.ApplyTo(newVersion, binder, prefix); } catch (UnknownPropertyInLogException<TPrincipal> e) { errors.Add(e); } } return Change.FromObjectChange(newVersion, change, errors: errors); }
public FilteredObjectChange(IObjectChange <TPrincipal> objectChange, IEnumerable <IPropertyChange <TPrincipal> > propertyChanges) { this.objectChange = objectChange; this.propertyChanges = propertyChanges; }
public Change(TValue value, IObjectChange <TPrincipal> objectChange, IEnumerable <Exception> errors = null) { Value = value; ObjectChange = objectChange; Errors = errors ?? new List <Exception>(); }
void IChangeSet <ApplicationUser> .Add(IObjectChange <ApplicationUser> objectChange) { ObjectChanges.Add((ObjectChange)objectChange); }
void IChangeSet <User> .Add(IObjectChange <User> objectChange) { ObjectChanges.Add((ObjectChange)objectChange); }
void IChangeSet <Usuario> .Add(IObjectChange <Usuario> objectChange) { ObjectChanges.Add((ObjectChange)objectChange); }