Beispiel #1
0
 public MsSqlDomainEventsConsumer(InMemoryApplicationEventBus bus, DomainEventsInformation domainEventsInformation,
                                  DbContext context)
 {
     _bus = bus;
     _domainEventsInformation = domainEventsInformation;
     _context = context;
 }
        private async Task ExecuteSubscribersAsync(DomainEventPrimitive domainEventPrimitive, CancellationToken cancellationToken)
        {
            var domainEventType = DomainEventsInformation.ForName(domainEventPrimitive.Name);

            var instance = (DomainEvent)Activator.CreateInstance(domainEventType);

            var result = (DomainEvent)domainEventType
                         .GetTypeInfo()
                         .GetDeclaredMethod(nameof(DomainEvent.FromPrimitives))
                         ?.Invoke(instance, new object[]
            {
                domainEventPrimitive.AggregateId,
                domainEventPrimitive.Body,
                domainEventPrimitive.Id,
                domainEventPrimitive.OccurredOn
            });

            await _bus.Publish(new List <DomainEvent> {
                result
            }, cancellationToken);

            _context.Set <DomainEventPrimitive>().Remove(domainEventPrimitive);
        }
Beispiel #3
0
        /// <summary>
        /// Domain event deserializer
        /// </summary>
        /// <param name="body"></param>
        /// <returns></returns>
        public DomainEvent Deserialize(string body)
        {
            var eventData = JsonConvert.DeserializeObject <Dictionary <string, Dictionary <string, object> > >(body);

            if (eventData == default)
            {
                throw new ArgumentException(nameof(body));
            }

            var data             = eventData["data"];
            var attributesString = data["attributes"].ToString();

            var attributes = JsonConvert.DeserializeObject <Dictionary <string, string> >(attributesString !);

            if (attributes == default)
            {
                throw new ArgumentException(nameof(body));
            }

            var domainEventType = DomainEventsInformation.ForName((string)data["type"]);

            var instance = ReflectionHelper.CreateInstance <DomainEvent>(domainEventType);

            var domainEvent = (DomainEvent)domainEventType
                              .GetTypeInfo()
                              .GetDeclaredMethod(nameof(DomainEvent.FromPrimitives))
                              ?.Invoke(instance, new object[]
            {
                attributes["id"],
                attributes,
                data["id"].ToString(),
                data["occurred_on"].ToString()
            });

            return(domainEvent);
        }