Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        IMementoEx IAggregateEx.GetSnapshot()
        {
            IMementoEx snapshot = this.GetSnapshot();

            snapshot.Id      = this.Id;
            snapshot.Version = this.Version;
            return(snapshot);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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));
        }
Ejemplo n.º 7
0
        public Boolean ValidateMemento(IMementoEx memento)
        {
            var validationErrors = InnerValidateMemento(memento);

            return(String.IsNullOrEmpty(validationErrors));
        }