public async Task UpdateReadStoresAsync( IReadOnlyCollection <IDomainEvent> domainEvents, CancellationToken cancellationToken) { var relevantDomainEvents = domainEvents .Where(e => AggregateEventTypes.Contains(e.EventType)) .ToList(); if (!relevantDomainEvents.Any()) { Log.Verbose(() => string.Format( "None of these events was relevant for read model '{0}', skipping update: {1}", ReadModelType.PrettyPrint(), string.Join(", ", domainEvents.Select(e => e.EventType.PrettyPrint())) )); return; } Log.Verbose(() => string.Format( "Updating read model '{0}' in store '{1}' with these events: {2}", typeof(TReadModel).PrettyPrint(), typeof(TReadModelStore).PrettyPrint(), string.Join(", ", relevantDomainEvents.Select(e => e.ToString())))); var readModelContext = new ReadModelContext(Resolver); var readModelUpdates = BuildReadModelUpdates(relevantDomainEvents); if (!readModelUpdates.Any()) { Log.Verbose(() => string.Format( "No read model updates after building for read model '{0}' in store '{1}' with these events: {2}", typeof(TReadModel).PrettyPrint(), typeof(TReadModelStore).PrettyPrint(), string.Join(", ", relevantDomainEvents.Select(e => e.ToString())))); return; } await ReadModelStore.UpdateAsync( readModelUpdates, readModelContext, UpdateAsync, cancellationToken) .ConfigureAwait(false); }
protected void ApplyEvents(TReadModel readModel, IEnumerable <IDomainEvent> domainEvents) { var readModelType = typeof(TReadModel); var readModelContextType = typeof(IReadModelContext); var readModelContext = new ReadModelContext(); foreach (var domainEvent in domainEvents) { var applyMethod = ApplyMethods.GetOrAdd( domainEvent.EventType, t => { var domainEventType = typeof(IDomainEvent <>).MakeGenericType(t); var methodInfo = readModelType.GetMethod("Apply", new[] { readModelContextType, domainEventType }); return(methodInfo == null ? (r, c, e) => Log.Warning("Read model '{0}' does not handle event '{1}'", readModelType.Name, t.Name) : (Action <TReadModel, IReadModelContext, IDomainEvent>)((r, c, e) => methodInfo.Invoke(r, new object[] { c, e }))); }); applyMethod(readModel, readModelContext, domainEvent); } }