/// <summary> /// Creates a new instance of the <see cref="VersionedAggregate{TState,TCommand,TEvent}"/> /// </summary> /// <param name="id">Aggregate id.</param> /// <param name="commandHandler">Command handler.</param> /// <param name="eventHandler">Event handler.</param> /// <param name="aggregate">Aggregate.</param> public VersionedAggregate(string id, Func <TState, TCommand, TEvent> commandHandler, Func <TState, TEvent, TState> eventHandler, IConcurrentVersions <TState, TEvent> aggregate = null) { Id = id; CommandHandler = commandHandler; EventHandler = eventHandler; Aggregate = aggregate; }
public static IConcurrentVersions <TVersioned, TUpdated> Resolve <TVersioned, TUpdated>( this IConcurrentVersions <TVersioned, TUpdated> versions, VectorTime selectedTimestamp) { var vt = versions.All .Select(x => x.VectorTimestamp) .Aggregate(VectorTime.Zero, (time, vectorTime) => time.Merge(vectorTime)); var st = versions.All .Select(x => x.SystemTimestamp) .Max(); return(versions.Resolve(selectedTimestamp, vt, st)); }
public static IConcurrentVersions <T1, T2> Resolve <T1, T2>(this IConcurrentVersions <T1, T2> versions, VectorTime selectedTimestamp) { var vectorTime = VectorTime.Zero; DateTime systemTime = default; foreach (var versioned in versions.All) { vectorTime = vectorTime.Merge(versioned.VectorTimestamp); systemTime = versioned.SystemTimestamp > systemTime ? versioned.SystemTimestamp : systemTime; } return(versions.Resolve(selectedTimestamp, vectorTime, systemTime)); }
public static bool IsConflicting <TVersioned, TUpdated>(this IConcurrentVersions <TVersioned, TUpdated> versions) => versions.All.Count() > 1;
protected ConcurrentVersionsSpec() { this.versions = Create(); }