Exemple #1
0
        /// <inheritdoc/>
        public IEnumerable <EventAndEnvelope> GetFor(IApplicationResourceIdentifier eventSource, EventSourceId eventSourceId)
        {
            var partitionKeyFilter = GetPartitionKeyFilterFor(eventSource, eventSourceId);
            var query = new TableQuery <DynamicTableEntity>().Where(partitionKeyFilter);

            var events = new List <DynamicTableEntity>();
            TableContinuationToken continuationToken = null;

            do
            {
                _table.ExecuteQuerySegmentedAsync(query, continuationToken).ContinueWith(e =>
                {
                    events.AddRange(e.Result.Results);
                    continuationToken = e.Result.ContinuationToken;
                }).Wait();
            } while (continuationToken != null);

            var eventsAndEnvelopes = events.OrderBy(e => long.Parse(e.RowKey)).Select(entity => {
                var eventResource       = GetApplicationResourceIdentifierFromSanitizedString(entity.Properties[PropertiesFor <EventEnvelope> .GetPropertyName(e => e.Event)].StringValue);
                var eventSourceResource = GetApplicationResourceIdentifierFromSanitizedString(entity.Properties[PropertiesFor <EventEnvelope> .GetPropertyName(e => e.EventSource)].StringValue);
                var envelope            = new EventEnvelope(
                    PropertiesFor <EventEnvelope> .GetValue(entity, e => e.CorrelationId),
                    PropertiesFor <EventEnvelope> .GetValue(entity, e => e.EventId),
                    PropertiesFor <EventEnvelope> .GetValue(entity, e => e.SequenceNumber),
                    PropertiesFor <EventEnvelope> .GetValue(entity, e => e.SequenceNumberForEventType),
                    PropertiesFor <EventEnvelope> .GetValue(entity, e => e.Generation),
                    eventResource,
                    PropertiesFor <EventEnvelope> .GetValue(entity, e => e.EventSourceId),
                    eventSourceResource,
                    PropertiesFor <EventEnvelope> .GetValue(entity, e => e.Version),
                    PropertiesFor <EventEnvelope> .GetValue(entity, e => e.CausedBy),
                    PropertiesFor <EventEnvelope> .GetValue(entity, e => e.Occurred)
                    );

                var eventType = _applicationResourceResolver.Resolve(envelope.Event);
                var @event    = Activator.CreateInstance(eventType, envelope.EventSourceId) as IEvent;
                eventType.GetProperties().Where(p => p.CanWrite).ForEach(p => p.SetValue(@event, PropertyHelper.GetValue(entity, p)));

                return(new EventAndEnvelope(envelope, @event));
            });

            return(eventsAndEnvelopes);
        }
Exemple #2
0
        /// <summary>
        /// Get a value from a <see cref="DynamicTableEntity"/> by giving the target objects property.
        /// From the expression given it will find the expected type and also the name of the property to
        /// look for in the entity from Azure Tables
        /// </summary>
        /// <typeparam name="TProperty"><see cref="Type"/> of property type - inferred</typeparam>
        /// <param name="entity"><see cref="DynamicTableEntity">Entity</see> to get from</param>
        /// <param name="property">Property expression</param>
        /// <returns>Value of the property from the <see cref="DynamicTableEntity">entity</see></returns>
        public static TProperty GetValue <TProperty>(DynamicTableEntity entity, Expression <Func <TTarget, TProperty> > property)
        {
            var propertyInfo = property.GetPropertyInfo();

            return((TProperty)PropertyHelper.GetValue(entity, propertyInfo));
        }