public IAggregateEx Build(Type type, IIdentity id, IMementoEx snapshot) { AggregateRoot aggregate = null; if (_kernel != null && _kernel.HasComponent(type)) { aggregate = (AggregateRoot)_kernel.Resolve(type); } else { var ctor = type.Constructor(Flags.Default, new Type[] { }); if (ctor == null) { throw new MissingDefaultCtorException(type); } aggregate = (AggregateRoot)ctor.CreateInstance(); } aggregate.AssignAggregateId(id); if (snapshot != null && aggregate is ISnapshotable) { ((ISnapshotable)aggregate).Restore(snapshot); } return(aggregate); }
IMementoEx IAggregateEx.GetSnapshot() { IMementoEx snapshot = this.GetSnapshot(); snapshot.Id = this.Id; snapshot.Version = this.Version; return(snapshot); }
public virtual void Restore(IMementoEx memento) { var validationErrors = InnerValidateMemento(memento); if (!String.IsNullOrEmpty(validationErrors)) { throw new ArgumentException(validationErrors, "memento"); } var eventUnfolderMemento = (EventUnfolderMemento)memento; _state = (TQueryModel)((TQueryModel)eventUnfolderMemento.Payload).Clone(); _snapshotVersion = Version = memento.Version; }
public TProjector GetById <TProjector, TViewModel>(IIdentity id, Int32 to) where TProjector : Projector <TViewModel> where TViewModel : BaseAggregateQueryModel, new() { var snapshotTypeName = typeof(TProjector).Name; var snapshot = _snapshotPersister.Load(id.AsString(), to, snapshotTypeName); var projector = _factory.Create <TViewModel>(typeof(TProjector), id); Int32 startsFromEvent = 0; IMementoEx memento = snapshot == null ? null : (IMementoEx)snapshot.Payload; if (memento != null) { if (!projector.ValidateMemento(memento)) { _snapshotPersister.Clear(id.AsString(), memento.Version, snapshotTypeName); } else { projector.Restore(memento); startsFromEvent = snapshot.StreamRevision; } } using (var events = _eventStore.OpenStream(projector.BucketId, id.AsString(), startsFromEvent, to)) { Int32 eventCount = 0; foreach (var evt in events.CommittedEvents) { projector.ApplyEvent((DomainEvent)evt.Body); eventCount++; } if (projector.ShouldSnapshot(eventCount)) { memento = projector.GetSnapshot(); snapshot = new Snapshot(id.AsString(), events.StreamRevision, memento); _snapshotPersister.Persist(snapshot, snapshotTypeName); } } return((TProjector)projector); }
private String InnerValidateMemento(IMementoEx memento) { if (!(memento is EventUnfolderMemento)) { return("Cannot restore Projector from type " + memento.GetType() + " expecting EventUnfolderSnapshot."); } EventUnfolderMemento eventUnfolderMemento = (EventUnfolderMemento)memento; if (eventUnfolderMemento.Payload.GetType() != typeof(TQueryModel)) { return("Payload of the memento is expected to be of type " + typeof(TQueryModel) + " but it is of type " + eventUnfolderMemento.Payload.GetType()); } if (eventUnfolderMemento.Signature != this.Signature) { return("Memento has wrong signature [" + eventUnfolderMemento + "] unfolder signature is " + Signature); } return(String.Empty); }
private IAggregateEx GetAggregate <TAggregate>(ISnapshot snapshot, IEventStream stream) { IMementoEx memento = snapshot == null ? null : snapshot.Payload as IMementoEx; return(this._factory.Build(typeof(TAggregate), _identityConverter.ToIdentity(stream.StreamId), memento)); }
public Boolean ValidateMemento(IMementoEx memento) { var validationErrors = InnerValidateMemento(memento); return(String.IsNullOrEmpty(validationErrors)); }