/// <summary>
        /// Gets the by ID.
        /// </summary>
        /// <typeparam name="TAggregateRoot">The type of the aggregate root.</typeparam>
        /// <param name="aggregateID">The aggregate ID.</param>
        /// <param name="queryOptions">The query options.</param>
        /// <returns></returns>
        public TAggregateRoot GetByID <TAggregateRoot>(object aggregateID, AggregateRootQueryOptions queryOptions)
            where TAggregateRoot : AggregateRoot
        {
            if (aggregateID == null)
            {
                throw new ArgumentNullException("aggregateID");
            }
            var aggregate = (_factory(typeof(TAggregateRoot)) as TAggregateRoot);

            if (aggregate == null)
            {
                throw new InvalidOperationException("aggregate");
            }
            // find snapshot
            var loaded = false;
            AggregateRootSnapshot snapshot = null;

            if (_snapshotStore != null)
            {
                var snapshoter = (aggregate as ICanAggregateRootSnapshot);
                if (snapshoter != null && (snapshot = _snapshotStore.GetLatestSnapshot <TAggregateRoot>(aggregateID)) != null)
                {
                    loaded = true;
                    snapshoter.LoadSnapshot(snapshot);
                }
            }
            // load events
            var events = _eventStore.GetEventsByID(aggregateID, (snapshot != null ? snapshot.LastEventSequence : 0));

            loaded |= ((IAggregateRootStateAccessor)aggregate).LoadFromHistory(events);
            return((queryOptions & AggregateRootQueryOptions.UseNullAggregates) == 0 ? aggregate : (loaded ? aggregate : null));
        }
Esempio n. 2
0
        /// <summary>
        /// Saves the snapshot.
        /// </summary>
        /// <param name="aggregateType">Type of the aggregate.</param>
        /// <param name="snapshot">The snapshot.</param>
        public void SaveSnapshot(Type aggregateType, AggregateRootSnapshot snapshot)
        {
            var connectionStringBuilder = new MongoConnectionStringBuilder(_connectionString);
            var database = MongoServer.Create(connectionStringBuilder).GetDatabase(connectionStringBuilder.DatabaseName);
            var query    = Query.EQ("AggregateID", _makeAggregateID(snapshot.AggregateID));
            var update   = new UpdateDocument
            {
                { "$set", snapshot.ToBson() }
            };

            database.GetCollection <AggregateRootSnapshot>(_tableName).Update(query, update, UpdateFlags.Upsert);
        }
Esempio n. 3
0
        /// <summary>
        /// Saves the snapshot.
        /// </summary>
        /// <param name="aggregateType">Type of the aggregate.</param>
        /// <param name="snapshot">The snapshot.</param>
        public void SaveSnapshot(Type aggregateType, AggregateRootSnapshot snapshot)
        {
            var streamID = (Guid)snapshot.AggregateID;

            _store.Advanced.AddSnapshot(new Snapshot(streamID, snapshot.LastEventSequence, snapshot));
        }