/// <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)); }
/// <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); }
/// <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)); }