예제 #1
0
        /// <summary>
        /// Creates a <see cref="StorableEvent" /> based on the specified domain event.
        /// </summary>
        /// <param name="domainEvent">The domain event.</param>
        public static StorableEvent ToStorableEvent(this IEvent domainEvent)
        {
            if (domainEvent == null)
            {
                throw new ArgumentNullException(nameof(domainEvent));
            }

            string eventStreamName = null;
            var    aggregateType   = domainEvent.AggregateType();

            eventStreamName = aggregateType != null
                                  ? AggregateType.EventStreamName(aggregateType)
                                  : ((dynamic)domainEvent).EventStreamName;

            return(new StorableEvent
            {
                Actor = domainEvent.Actor(),
                StreamName = eventStreamName,
                SequenceNumber = domainEvent.SequenceNumber,
                AggregateId = domainEvent.AggregateId,
                Type = domainEvent.EventName(),
                Body = JsonConvert.SerializeObject(domainEvent, Formatting.None, serializerSettings.Value),
                Timestamp = domainEvent.Timestamp,
                ETag = domainEvent.ETag,
                Id = domainEvent.AbsoluteSequenceNumber()
            });
        }
예제 #2
0
        internal void ScheduleIfNeeded(IEvent e)
        {
            var aggregateType = e.AggregateType();

            if (e.GetType().IsConstructedGenericType&&
                e.GetType().GetGenericTypeDefinition() == typeof(CommandScheduled <>))
            {
                DateTimeOffset dueTime = ((dynamic)e).DueTime;
                var            now     = Clock.Now();
                if (dueTime > now)
                {
                    dynamic commandScheduler = GetOrAddCommandScheduler(aggregateType);
                    Task    schedule         = commandScheduler.Schedule((dynamic)e);
                    schedule.Wait(TimeSpan.FromSeconds(5));
                }
            }
        }
예제 #3
0
        internal void ScheduleIfNeeded(IEvent e)
        {
            var aggregateType = e.AggregateType();

            var scheduledCommand = e as IScheduledCommand;

            if (scheduledCommand != null)
            {
                DateTimeOffset dueTime = ((dynamic)e).DueTime;
                var            now     = Clock.Now();
                if (dueTime > now)
                {
                    dynamic commandScheduler = GetOrAddCommandScheduler(aggregateType);
                    Task    schedule         = commandScheduler.Schedule((dynamic)e);
                    schedule.Wait(TimeSpan.FromSeconds(5));
                }
            }
        }
예제 #4
0
 public static string EventStreamName(this IEvent @event) =>
 @event.IfTypeIs <DynamicEvent>()
 .Then(e => e.EventStreamName)
 .Else(() => EventStreamName(@event.AggregateType()));