示例#1
0
 public DefaultEventSerializer(
     ISerializer serializer,
     IEventMetadataProvider metadataProvider,
     ILogger <DefaultEventSerializer> logger)
 {
     _serializer       = serializer ?? throw new ArgumentNullException(nameof(serializer));
     _metadataProvider = metadataProvider ?? throw new ArgumentNullException(nameof(metadataProvider));
     _logger           = logger ?? throw new ArgumentNullException(nameof(logger));
 }
示例#2
0
 public Repository(IEventStoreTransaction transaction, IEventMetadataProvider metadataProvider)
 {
     _transaction      = Check.NotNull(transaction, nameof(transaction));
     _metadataProvider = Check.NotNull(metadataProvider, nameof(metadataProvider));
 }
        public void SaveAndGet(
            TestEventStore store,
            Repository <Customer> repo,
            Customer c,
            Customer duplicate,
            Customer invalid,
            List <IEvent> allChanges
            )
        {
            GIVEN["a TestEventStore"] = () => store = new TestEventStore();
            GIVEN["a repository"]     = () => {
                IEventMetadataProvider provider = Substitute.For <IEventMetadataProvider>();
                provider.Provide().Returns(new DefaultEventMetadata(DateTime.Now));
                repo = new Repository <Customer>(store.UseTransaction(null), provider);
            };

            AND["a new customer with pending changes"] = () => {
                IEvent[] changes = { new Customer.Created(), new Customer.Promoted() };
                allChanges = new List <IEvent>(changes);

                c = Substitute.For <Customer>(ID.NewID());
                c.SetupGetChanges(isNew: true, changes);
            };

            When["calling Save"] = () => Save(repo, c);

            THEN["the changes are stored in the event store"] = () =>
                                                                store.All.Single().Events.Should().BeEquivalentTo(c.RecordedChanges);

            AND["ClearChanges was called"] = () => c.Received().ClearChanges();

            GIVEN["an existing customer with changes"] = () => {
                IEvent[] changes = { new Customer.AddressChanged() };
                allChanges.AddRange(changes);

                c.SetupGetChanges(isNew: false, changes);
            };

            When["calling Save"] = () => Save(repo, c);

            THEN["the changes are stored in the event store"] = () =>
                                                                store.All.ElementAt(1).Events.Should().BeEquivalentTo(c.RecordedChanges);

            GIVEN["a new customer with an existing ID"] = () => {
                duplicate = new Customer(c.ID);
                duplicate.SetupGetChanges(isNew: true);
            };

            Then["calling Save", ThrowsA <InvalidOperationException>()] = () => Save(repo, duplicate);

            GIVEN["a new customer where Changeset.IsNew returns false"] = () => {
                invalid = new Customer(ID.NewID());
                invalid.SetupGetChanges(isNew: false);
            };

            Then["calling Save", ThrowsA <InvalidOperationException>()] = () => Save(repo, invalid);

            When["saving a second customr"] = () => {
                Customer second = new Customer(ID.NewID());
                second.SetupGetChanges(isNew: true, new Customer.Created());
                return(Save(repo, second));
            };

            And["getting the first object"] = async() => c = await repo.Get(c.ID);

            THEN["Restore was called with the original events"] = () =>
                                                                  c.RestoreArgument.Should().BeEquivalentTo(allChanges, o => o.WithStrictOrdering());
        }