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); }
/// <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); }