private DomainEvent ToDomainEvent(OutboxEvent outboxEvent)
        {
            var eventType   = Type.GetType(outboxEvent.EventName);
            var domainEvent = JsonSerializer.Deserialize(outboxEvent.Payload, eventType);

            return((DomainEvent)domainEvent);
        }
        public IEvent FromOutboxEvent(OutboxEvent @event)
        {
            var assembly  = Assembly.GetAssembly(typeof(IEvent));
            var eventType = assembly.GetTypes()
                            .FirstOrDefault(x => x.Name == @event.EventType)
                            ?? throw new ArgumentNullException(nameof(@event.EventType), $"Cannot find EventType for event with Id: {@event.Id}.");

            return((IEvent)eventType.GetMethod("CreateFromMessage")?.Invoke(null, new object [] { @event.Id, @event.CreatedDate, @event.Message }));
        }
Example #3
0
        public async Task <ActionResult> PostProductSagaChoreography(ProductRequestDto productRequestDto)
        {
            var @event = new ProductCreated {
                Guid = Guid.NewGuid(), Id = 5, Name = "Twarożek"
            };
            var product = _mapper.Map <Product>(productRequestDto);

            _context.Products.Add(product);

            var data         = JsonSerializer.Serialize(product);
            var productEvent = new OutboxEvent(data, "ProductCreated");

            _context.OutboxEvents.Add(productEvent);

            await _context.SaveChangesAsync();

            return(Ok());
        }
        public async Task <Unit> Handle(ProductCreated productCreated, CancellationToken cancellationToken)
        {
            _logger.LogInformation($"---- Received {nameof(ProductCreated)} message: Product.Guid = [{productCreated.Guid}] ----");
            try
            {
                if (productCreated.Name.EndsWith('1'))
                {
                    _logger.LogError($"---- PRODUCT ENDS WITH '1' !!! THAT IS NOT VALID: Product.Guid = [{productCreated.Guid}] ----");
                    throw new System.Exception($"PRODUCT ENDS WITH '1' !!! THAT IS NOT VALID: Product.Guid = [{productCreated.Guid}]");
                }

                using (var scope = _serviceScopeFactory.CreateScope())
                {
                    var context = scope.ServiceProvider.GetRequiredService <ShippingContext>();

                    var product = _mapper.Map <Product>(productCreated);
                    context.Products.Add(product);

                    await context.SaveChangesAsync();
                }
                _logger.LogInformation($"---- Saved {nameof(ProductCreated)} message: Product.Guid = [{productCreated.Guid}] ----");
            }
            catch (System.Exception ex)
            {
                _logger.LogError($"Exception :( Guid = [{productCreated.Guid}]");
                using (var scope = _serviceScopeFactory.CreateScope())
                {
                    var context         = scope.ServiceProvider.GetRequiredService <ShippingContext>();
                    var productRejected = new ProductRejected {
                        Guid = productCreated.Guid
                    };

                    var data         = JsonSerializer.Serialize(productRejected);
                    var productEvent = new OutboxEvent(data, "ProductRejected");
                    context.OutboxEvents.Add(productEvent);

                    await context.SaveChangesAsync();
                }
            }

            return(await Task.FromResult(Unit.Value));
        }
 public async Task Add(EventMessage eventMessage) => await _eventDataWriter.Add(OutboxEvent.FromEventMessage(eventMessage));
Example #6
0
 public void Remove(OutboxEvent outboxEvent)
 {
     _context.Remove(outboxEvent);
     _context.SaveChanges();
 }
Example #7
0
 public async Task Add(OutboxEvent outboxEvent) => await _context.Events.AddAsync(outboxEvent);
Example #8
0
 public async Task PublishAsync(OutboxEvent @event)
 {
     await _bus.Publish(@event.GetEvent(), @event.Metadata);
 }