Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
            }
        }