示例#1
0
        private static Func <StoredEvent, IEvent> DeserializeAsDynamicEvent(
            DeserializeEvent deserialize)
        {
            return(e =>
            {
                dynamic deserializeObject = deserialize(e.Body);
                var dynamicEvent = new DynamicEvent(deserializeObject)
                {
                    EventStreamName = e.StreamName,
                    EventTypeName = e.EventTypeName,
                    AggregateId = e.AggregateId,
                    SequenceNumber = e.SequenceNumber,
                    Timestamp = e.Timestamp,
                    ETag = e.ETag
                };

                return dynamicEvent;
            });
        }
示例#2
0
        private static Func <StoredEvent, IEvent> DeserializeAsDynamicEvent(
            JsonSerializerSettings serializerSettings)
        {
            return(e =>
            {
                dynamic deserializeObject = JsonConvert.DeserializeObject(e.Body, serializerSettings);
                var dynamicEvent = new DynamicEvent(deserializeObject)
                {
                    EventStreamName = e.StreamName,
                    EventTypeName = e.EventTypeName,
                    AggregateId = e.AggregateId,
                    SequenceNumber = e.SequenceNumber,
                    Timestamp = e.Timestamp,
                    ETag = e.ETag
                };

                return dynamicEvent;
            });
        }
示例#3
0
        /// <summary>
        /// Deserializes a domain event.
        /// </summary>
        /// <param name="aggregateName">Name of the aggregate.</param>
        /// <param name="eventName">Name of the event type.</param>
        /// <param name="aggregateId">The aggregate identifier.</param>
        /// <param name="sequenceNumber">The sequence number of the event.</param>
        /// <param name="timestamp">The timestamp of the event.</param>
        /// <param name="body">The body of the event.</param>
        /// <param name="uniqueEventId">The unique event identifier.</param>
        /// <param name="serializerSettings">The serializer settings used when deserializing the event body.</param>
        /// <param name="etag">The ETag of the event.</param>
        /// <returns></returns>
        public static IEvent DeserializeEvent(string aggregateName,
                                              string eventName,
                                              Guid aggregateId,
                                              long sequenceNumber,
                                              DateTimeOffset timestamp,
                                              string body,
                                              dynamic uniqueEventId = null,
                                              JsonSerializerSettings serializerSettings = null,
                                              string etag = null)
        {
            var deserializerKey = aggregateName + ":" + eventName;

            var @event = deserializers.GetOrAdd(deserializerKey, _ =>
            {
                var aggregateType = AggregateType.KnownTypes.SingleOrDefault(t => t.Name == aggregateName);

                if (aggregateType != null)
                {
                    serializerSettings = serializerSettings ?? Settings;

                    IEnumerable <Type> eventTypes = typeof(Event <>).MakeGenericType(aggregateType).Member().KnownTypes;

                    // some events contain specialized names, e.g. CommandScheduled:DoSomething. the latter portion is not interesting from a serialization standpoint, so we strip it off.
                    eventName     = eventName.Split(':').First();
                    var eventType = eventTypes.SingleOrDefault(t =>
                                                               t.GetCustomAttributes(false)
                                                               .OfType <EventNameAttribute>()
                                                               .FirstOrDefault()
                                                               .IfNotNull()
                                                               .Then(
                                                                   att => att.EventName == eventName)
                                                               .Else(() =>
                                                                     // strip off generic specifications from the type name
                                                                     t.Name.Split('`').First() == eventName));

                    if (eventType != null)
                    {
                        return(e =>
                        {
                            var deserializedEvent = (IEvent)JsonConvert.DeserializeObject(e.Body, eventType, serializerSettings);

                            var dEvent = deserializedEvent as Event;
                            if (dEvent != null)
                            {
                                dEvent.AggregateId = e.AggregateId;
                                dEvent.SequenceNumber = e.SequenceNumber;
                                dEvent.Timestamp = e.Timestamp;
                                dEvent.ETag = e.ETag;
                            }

                            return deserializedEvent;
                        });
                    }

                    // even if the domain no longer cares about some old event type, anonymous events are returned as placeholders in the EventSequence
                    eventType = typeof(AnonymousEvent <>).MakeGenericType(aggregateType);

                    return(e =>
                    {
                        var anonymousEvent = (Event)JsonConvert.DeserializeObject(e.Body, eventType, serializerSettings);
                        anonymousEvent.AggregateId = e.AggregateId;
                        anonymousEvent.SequenceNumber = e.SequenceNumber;
                        anonymousEvent.Timestamp = e.Timestamp;
                        anonymousEvent.ETag = e.ETag;
                        ((dynamic)anonymousEvent).Body = e.Body;

                        return anonymousEvent;
                    });
                }

                return(e =>
                {
                    dynamic deserializeObject = JsonConvert.DeserializeObject(e.Body, serializerSettings);
                    var dynamicEvent = new DynamicEvent(deserializeObject)
                    {
                        EventStreamName = e.StreamName,
                        EventTypeName = e.EventTypeName,
                        AggregateId = e.AggregateId,
                        SequenceNumber = e.SequenceNumber,
                        Timestamp = e.Timestamp,
                        ETag = e.ETag
                    };

                    return dynamicEvent;
                });
            })(new StoredEvent
            {
                StreamName     = aggregateName,
                EventTypeName  = eventName,
                Body           = body,
                AggregateId    = aggregateId,
                SequenceNumber = sequenceNumber,
                Timestamp      = timestamp,
                ETag           = etag
            });

            if (uniqueEventId != null)
            {
                @event.IfTypeIs <IHaveExtensibleMetada>()
                .Then(e => e.Metadata.AbsoluteSequenceNumber = uniqueEventId);
            }

            return(@event);
        }