Пример #1
0
        public MongoStores(IMongoDatabase database,
                           IProjectionRebuilder projectionRebuilder = null,
                           MongoEventStreamReader eventStreamReader = null,
                           MongoEventStoreSetttings setttings       = null)
        {
            if (database == null)
            {
                throw new ArgumentNullException(nameof(database));
            }

            _projectionRebuilder = projectionRebuilder;
            _eventStreamReader   = eventStreamReader;

            if (setttings == null)
            {
                setttings = new MongoEventStoreSetttings();
            }

            setttings.Validate();

            Settings     = setttings;
            Client       = database.Client;
            DatabaseName = database.DatabaseNamespace.DatabaseName;

            _eventStore = new MongoEventStore(database, setttings)
            {
                JsonSettings = JsonSettings
            };

            _snapshotStore = new MongoSnapshotStore(_eventStore, database, setttings);
        }
        public async Task Should_update_specific_projections()
        {
            // Arrange

            var activeUser = new User(Guid.NewGuid(), "Bryan", "Cranston", new DateTime(1956, 3, 7));

            activeUser.ChangeFirstName("Walter");
            activeUser.ChangeLastName("White");
            activeUser.ChangeFirstName("Walt");
            activeUser.ChangeLastName("Heisenberg");

            var strategy = new MongoProjectionStrategy();

            var documentStore = new MongoProjectionStore(strategy, _fixture.Database);

            var allUserProjection        = new AllUserProjections(documentStore);
            var onlyActiveUserProjection = new OnlyActiveUserProjections(documentStore);

            var projectionProcessor = new ProjectionRebuilder(documentStore, new object[] { allUserProjection, onlyActiveUserProjection });
            var eventStreamReader   = new MongoEventStreamReader(_fixture.Database);
            var stores = new MongoStores(_fixture.Database, projectionProcessor, eventStreamReader);

            var session = SessionHelper.Create(stores, stores);

            await session.AddAsync(activeUser).ConfigureAwait(false);

            await session.SaveChangesAsync().ConfigureAwait(false);

            var reader1 = documentStore.GetReader <Guid, AllUserView>();

            reader1.TryGet(activeUser.Id, out AllUserView view1).Should().BeTrue();

            if (view1 != null)
            {
                view1.Id.Should().Be(activeUser.Id);
                view1.BirthMonth.Should().Be(3);
                view1.BirthYear.Should().Be(1956);
                view1.Fullname.Should().Be("Heisenberg, Walt");
                view1.DeactivatedAt.Should().BeNull();
                view1.Lifetime.Should().BeNull();
            }

            var reader2 = documentStore.GetReader <Guid, ActiveUserView>();

            reader2.TryGet(activeUser.Id, out ActiveUserView view2).Should().BeTrue();

            if (view2 != null)
            {
                view2.Id.Should().Be(activeUser.Id);
            }
        }
        public async Task Should_project_multiples_views()
        {
            // Arrange

            var activeUser = new User(Guid.NewGuid(), "Bryan", "Cranston", new DateTime(1956, 3, 7));

            activeUser.ChangeFirstName("Walter");
            activeUser.ChangeLastName("White");
            activeUser.ChangeFirstName("Walt");
            activeUser.ChangeLastName("Heisenberg");

            var inactiveUser = new User(Guid.NewGuid(), "Aaron Paul", "Sturtevant", new DateTime(1979, 8, 27));

            inactiveUser.ChangeLastName("Bruce Pinkman");
            inactiveUser.ChangeFirstName("Jesse");
            inactiveUser.Deactivate();

            var stores  = new MongoStores(_fixture.Database);
            var session = SessionHelper.Create(stores, stores);

            await session.AddAsync(activeUser).ConfigureAwait(false);

            await session.AddAsync(inactiveUser).ConfigureAwait(false);

            await session.SaveChangesAsync().ConfigureAwait(false);

            var eventStreamReader = new MongoEventStreamReader(_fixture.Database);

            var strategy = new MongoProjectionStrategy();

            var documentStore = new MongoProjectionStore(strategy, _fixture.Database);

            var allUserProjection        = new AllUserProjections(documentStore);
            var onlyActiveUserProjection = new OnlyActiveUserProjections(documentStore);

            // Act

            var projectionProcessor = new ProjectionRebuilder(documentStore, new object[] { allUserProjection, onlyActiveUserProjection });

            await projectionProcessor.RebuildAsync(eventStreamReader).ConfigureAwait(false);

            // Assert

            var tempCollection = _fixture.Database.GetCollection <BsonDocument>(_fixture.Settings.TempProjectionsCollectionName);
            var collection     = _fixture.Database.GetCollection <BsonDocument>(_fixture.Settings.ProjectionsCollectionName);

            var filterBuilder = new FilterDefinitionBuilder <BsonDocument>();
            var filter        = filterBuilder.In("_t", new[] { nameof(AllUserView), nameof(ActiveUserView) });

            tempCollection.Count(filter).Should().Be(3);
            collection.Count(filter).Should().Be(3);

            var reader1 = documentStore.GetReader <Guid, AllUserView>();

            reader1.TryGet(activeUser.Id, out AllUserView view1).Should().BeTrue();

            if (view1 != null)
            {
                view1.Id.Should().Be(activeUser.Id);
                view1.BirthMonth.Should().Be(3);
                view1.BirthYear.Should().Be(1956);
                view1.Fullname.Should().Be("Heisenberg, Walt");
                view1.DeactivatedAt.Should().BeNull();
                view1.Lifetime.Should().BeNull();
            }

            reader1.TryGet(inactiveUser.Id, out view1).Should().BeTrue();

            if (view1 != null)
            {
                view1.Id.Should().Be(inactiveUser.Id);
                view1.BirthMonth.Should().Be(8);
                view1.BirthYear.Should().Be(1979);
                view1.Fullname.Should().Be("Bruce Pinkman, Jesse");
                view1.DeactivatedAt.Should().NotBeNull();
                view1.Lifetime.Should().NotBeNull();
            }

            var reader2 = documentStore.GetReader <Guid, ActiveUserView>();

            reader2.TryGet(activeUser.Id, out ActiveUserView view2).Should().BeTrue();

            if (view2 != null)
            {
                view2.Id.Should().Be(activeUser.Id);
            }

            reader2.TryGet(inactiveUser.Id, out view2).Should().BeFalse();
        }