private void OnTimerElapsed(object sender, ElapsedEventArgs e) { try { timer.Stop(); using (var db = new EventCommitsDomainContext()) { var query = db.DomainEventCommits.Where(c => c.IsDispatched == false); foreach (var item in query) { //hardcoding a lot of assumptions in this crappy code, it's a sample. var evt = item.Event; var evtTypeString = ConcreteProxyCreator.GetValidTypeName(evt.GetType()); var evtType = Type.GetType(evtTypeString); var handlerType = typeof(IHandleEvent <>).MakeGenericType(evtType); var handlers = this.container.ResolveAll(handlerType); foreach (var handler in handlers) { var method = handler.GetType() .GetMethod("Handle"); method.Invoke(handler, new[] { evt }); } item.IsDispatched = true; } db.SaveChanges(); } } finally { timer.Start(); } }
protected void RaiseEvent <TEvent>(Action <TEvent> builder) where TEvent : IDomainEvent { var newVersion = this.Version + 1; var @event = ConcreteProxyCreator.CreateInsance <TEvent>(); @event.Id = Guid.NewGuid(); @event.OccurredAt = DateTimeOffset.Now; @event.AggregateId = this.Id; @event.AggregateVersion = newVersion; builder(@event); this._uncommittedEvents.Add(@event); this.Version = newVersion; }