static void Main(string[] args)
        {
            var eventStore = new EventStoreMock();
            var keyStore   = new KeyStoreMock();
            var repository = new EventRepository(eventStore, keyStore);

            UserRegistrationCommandService = new UserRegistrationCommandService(repository);
            UserRegistrationQueryService   = new UserRegistrationQueryService(repository);

            while (!ExitCommandGiven)
            {
                Parser
                .Default
                .ParseArguments <AddOptions, VerifyOptions, SearchOptions, ExitOptions>(args)
                .MapResult(
                    (AddOptions options) => Add(options).Result,
                    (VerifyOptions options) => Verify(options).Result,
                    (SearchOptions options) => Search(options).Result,
                    (ExitOptions _) => Exit(),
                    errors => 1);

                Console.WriteLine("Provide a command or type help for options");
                args = Console.ReadLine().Split(' ');
            }
        }
        public void Initialize()
        {
            EventStore = new EventStoreMock();
            KeyStore   = new KeyStoreMock();

            var eventRepository = new EventRepository(EventStore, KeyStore);

            UserRegistrationCommandService = new UserRegistrationCommandService(eventRepository);
            UserRegistrationQueryService   = new UserRegistrationQueryService(eventRepository);
        }
        public void SavingAnAggregateWithNoEvents()
        {
            var storageMock = new EventStoreMock();
            var repository = new Repository<AggregateRootMock>(storageMock);

            var rootMock = new AggregateRootMock(Guid.NewGuid());

            repository.Save(rootMock, 0);

            storageMock.AssertSaveCalls(1);
        }
        public void GetAnAggregateWithSomeEventsReturnsEvents()
        {
            var aggregateId = Guid.NewGuid();
            var @event = new Event();
            var storageMock = new EventStoreMock().SeedEvents(aggregateId, @event);
            var repository = new Repository<AggregateRootMock>(storageMock);

            var rootMock = new AggregateRootMock(aggregateId);
            rootMock.SomeEvent(@event);

            repository.Save(rootMock, 0);
            var actualRoot = repository.GetById(aggregateId);
            
            Assert.Equal(@event, actualRoot.MyEvent);
        }
        public void SavingAnAggregateWithSomeEventsStoresThoseEventsInTheEventStore()
        {
            var storageMock = new EventStoreMock();
            var repository = new Repository<AggregateRootMock>(storageMock);

            var rootMock = new AggregateRootMock(Guid.NewGuid());
            var @event = new Event();
            rootMock.SomeEvent(@event);

            repository.Save(rootMock, 0);

            storageMock.AssertSaveCalls(1);
            Assert.Equal(@event, rootMock.MyEvent);
            Assert.Equal(1, storageMock.LatestEvents.Count());
            var storedEvent = storageMock.LatestEvents.First();
            Assert.Equal(@event, storedEvent);
        }