public void store_a_bunch_of_events()
        {
            var ar = new Account {Id = _id};
            var eventsToPersist = new List<object>();
            eventsToPersist.Add(new AccountOpened{InitialDeposit = 5,Name = "test"});
            var startEventsAt = DateTime.Now.AddYears(-1);
            for(var i = 0; i< 100; i++)
            {
               object @event = null;
               if(i % 1 == 0)
               {
                   @event = new Deposit {Amount = i,AccountId = ar.Id,At = startEventsAt.AddDays(i) };
               }else
               {
                   @event = new WithDraw {Amount = i, AccountId = ar.Id, At = startEventsAt.AddDays(i)};
               }

               eventsToPersist.Add(@event);
            }
            _eventStore.Persist(ar.Id,eventsToPersist.ToArray());
        }
 public void get_events()
 {
     var ar = new Account {Id = _id};
     var startedGettingStreamAt = DateTime.Now;
     var stream = _eventStore.GetEventStream(_id).ToList();
     //Console.WriteLine("Took {0} milliseconds to get stream of {1} events", (DateTime.Now - startedGettingStreamAt).TotalMilliseconds, stream.Count());
     var startedApplyingEventsAt = DateTime.Now;
     foreach(var @event in stream)
     {
         var eventType = @event.GetType();
         var applyMethod = ar.GetType().GetMethods()
             .FirstOrDefault(
                 mi => mi.Name == "Apply" && mi.GetParameters().Any(pi => pi.ParameterType == eventType));
         if (applyMethod != null)
             applyMethod.Invoke(ar, new[]{@event});
     }
     Console.WriteLine("Took {0} milliseconds to playback events",(DateTime.Now -  startedApplyingEventsAt).TotalMilliseconds);
     foreach (var activity in ar.Activity)
     {
         Console.WriteLine(activity);
     }
 }